1. 程式人生 > 其它 >java實現樹的前序遍歷,遞迴和非遞迴實現(簡單明瞭)

java實現樹的前序遍歷,遞迴和非遞迴實現(簡單明瞭)

技術標籤:javajava遞迴

程式碼複製貼上可以直接執行,相關注釋都寫上了,中序和後序遍歷同理,簡單明瞭

package tree;
import java.util.ArrayList;
import java.util.Stack;
public  class java_tree {
    //先定義一個結點類,方便後續操作
     class TreeNode {
        int val;        //結點的值大小
        TreeNode left;  //左節點
        TreeNode right;  //右節點
        TreeNode(int
x) { val = x; } } static TreeNode[] node = new TreeNode[10];//以陣列形式定義一棵完全二叉樹,作為java_tree的成員變數 public void init() { //初始化方法,用來生成完全二叉樹 for (int i = 0;i < 10; i++) { node[i] = new TreeNode(i); } for (int i = 0;i < 10; i++) { if
(i * 2 + 1 < 10) node[i].left = node[i * 2 + 1]; if (i * 2 + 2 < 10) node[i].right = node[i * 2 + 2]; } } //----------------------------------------------前序遍歷----------------------------------------------------------------- //遞迴實現 public void
preOrder(TreeNode root) { if (root != null) { System.out.print(root.val + " "); preOrder(root.left); //左結點遍歷完了就遍歷右結點。 preOrder(root.right); } } //非遞迴實現 public ArrayList preOrder1(TreeNode root) { Stack<TreeNode> stack = new Stack<TreeNode>(); ArrayList alist = new ArrayList(); //用來存放遍歷結果 TreeNode p = root; while (p != null || !stack.empty()) { while (p != null) { //這裡while語句是一直遍歷左結點,直到所有左結點遍歷完 alist.add(p.val); stack.push(p); p = p.left; } if (!stack.empty()) { //到哪個結點遍歷結束左邊結點,就彈出這個這個結點,開始遍歷又結點 TreeNode temp = stack.pop(); p = temp.right; } } return alist; } //----------------------------------------------中序遍歷----------------------------------------------------------------- //----------------------------------------------後序遍歷----------------------------------------------------------------- //測試方法 public static void main(String[] args) { java_tree test=new java_tree(); test.init(); //執行初始化方法 System.out.print("前序遍歷(遞迴):"); test.preOrder(node[0]); //前序,遞迴實現 System.out.println(); System.out.print("前序遍歷(非遞迴):"); System.out.println(test.preOrder1(node[0])); } }

在這裡插入圖片描述