package test; //前序遍歷的遞歸實現與非遞歸實現 import java.util.Stack; public class Test { public static void main(String[] args) { TreeNode[] node = new TreeNode[10];//以數組形式生成一棵完全二叉樹 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]; } preOrderRe(node[0]); } public static void preOrderRe(TreeNode biTree) {//遞歸實現 System.out.println(biTree.value); TreeNode leftTree = biTree.left; if(leftTree != null) { preOrderRe(leftTree); } TreeNode rightTree = biTree.right; if(rightTree != null) { preOrderRe(rightTree); } } public static void preOrder(TreeNode biTree) {//非遞歸實現 Stack<TreeNode> stack = new Stack<TreeNode>(); while(biTree != null || !stack.isEmpty()) { while(biTree != null) { System.out.println(biTree.value); stack.push(biTree); biTree = biTree.left; } if(!stack.isEmpty()) { biTree = stack.pop(); biTree = biTree.right; } } } } class TreeNode//節點結構 { int value; TreeNode left; TreeNode right; TreeNode(int value) { this.value = value; } }
二叉樹的遍歷
二叉樹的遍歷分為三種:前序遍歷 中序遍歷 后序遍歷
前序遍歷:按照“根左右”,先遍歷根節點,再遍歷左子樹 ,再遍歷右子樹
中序遍歷:按照“左根右“,先遍歷左子樹,再遍歷根節點,最后遍歷右子樹
后續遍歷:按照“左右根”,先遍歷左子樹,再遍歷右子樹,最后遍歷根節點
其中前,后,中指的是每次遍歷時候的根節點被遍歷的順序
二叉樹遍歷:
前根左右
中左根右
后左右根