java實現樹的前序遍歷,遞迴和非遞迴實現(簡單明瞭)
阿新 • • 發佈:2020-12-28
程式碼複製貼上可以直接執行,相關注釋都寫上了,中序和後序遍歷同理,簡單明瞭
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]));
}
}