二叉樹的前中後序遍歷(遞迴+非遞迴)
阿新 • • 發佈:2018-11-21
/** * 二叉樹節點類 * @author wj * */ class TreeNode{ int value; TreeNode left_Node; TreeNode right_Node; public TreeNode(int value) { this.value = value; this.left_Node = null; this.right_Node = null; } } /** * 二叉樹類 * @author wj * */ class BinaryTree{ /** * 根結點 */ public TreeNode treeNode; /** * 利用傳入一個數組的引數來建立二叉樹 */ public BinaryTree(int[] data) { for(int i = 0;i < data.length;i++) { Add_Node_To_Tree(data[i]); } } private void Add_Node_To_Tree(int value) { // TODO Auto-generated method stub if(treeNode == null) { treeNode = new TreeNode(value); return; } /** * 建立二叉樹 */ TreeNode currentNode = treeNode; while(true) { if(value < currentNode.value) {//在左子樹 if(currentNode.left_Node == null) { currentNode.left_Node = new TreeNode(value); return ; }else { currentNode = currentNode.left_Node; } }else{ if(currentNode.right_Node == null) { currentNode.right_Node = new TreeNode(value); return ; }else { currentNode = currentNode.right_Node; } } } } /** * 中序遍歷 * @param node */ public static void inOrder(TreeNode node) { if(node != null) { inOrder(node.left_Node); System.out.print("["+node.value+"] "); inOrder(node.right_Node); } } /** * 前序遍歷 * @param args */ public static void perOrder(TreeNode node) { if(node != null) { System.out.print("["+node.value+"] "); perOrder(node.left_Node); perOrder(node.right_Node); } } /** * 後序遍歷 */ public static void PostOrder(TreeNode node) { if(node != null) { PostOrder(node.left_Node); PostOrder(node.right_Node); System.out.print("["+node.value+"] "); } } /** * 非遞迴先序遍歷 * @param node */ public static void newperOrder(TreeNode head) { if(head == null) { return; } Stack<TreeNode> stack = new Stack<>(); stack.add(head); while(!stack.empty()){ head = stack.pop(); System.out.print(head.value+" "); if(head.right_Node != null) { stack.add(head.right_Node); } if(head.left_Node != null) { stack.add(head.left_Node); } } } /** * 非遞迴中序遍歷 * @param node */ public static void newinOrder(TreeNode head) { if(head == null) { return; } Stack<TreeNode> stack = new Stack<>(); while(!stack.empty() || head!= null) { if(head != null) { stack.add(head); head = head.left_Node; }else { head = stack.pop(); System.out.print(head.value+" "); head = head.right_Node; } } } /** * 非遞迴後序遍歷 * @param node */ public static void newPostOrder(TreeNode head) { if(head == null) { return; } Stack<TreeNode> stack = new Stack<>(); Stack<TreeNode> stack1 = new Stack<>(); stack.add(head); while(!stack.empty()) { head = stack.pop(); stack1.add(head); if(head.left_Node != null) { stack.add(head.left_Node); } if(head.right_Node != null) { stack.add(head.right_Node); } } while(!stack1.empty()) { System.out.print(stack1.pop().value+" "); } } } public class Test2 { public static void main(String[] args) { int[] data = {6,3,5,9,7,8,4,2}; BinaryTree binaryTree = new BinaryTree(data); BinaryTree.inOrder(binaryTree.treeNode); System.out.println(); BinaryTree.perOrder(binaryTree.treeNode); System.out.println(); BinaryTree.PostOrder(binaryTree.treeNode); System.out.println(); BinaryTree.newperOrder(binaryTree.treeNode); System.out.println(); BinaryTree.newinOrder(binaryTree.treeNode); System.out.println(); BinaryTree.newPostOrder(binaryTree.treeNode); } }
先序:中 左 右
中序:左 中 右
後序:左 右 中