輸入:一個先序的數組,將數組中的元素構建成爲二叉樹java
1 package test.tree; 2 3 import java.util.ArrayList; 4 import java.util.Stack; 5 6 public class BinaryTree { 7 private TreeNode root; 8 private int size = 0; 9 10 public BinaryTree() { 11 } 12 13 public BinaryTree(int value) { 14 this.root = new TreeNode(value); 15 this.size = 1; 16 } 17 18 public TreeNode getRoot() { 19 return root; 20 } 21 22 23 /** 24 * 先序遍歷遞歸實現 25 * @param node 26 * @param container 27 */ 28 public void preOrderTreeWalk(TreeNode node, ArrayList<Integer> container) { 29 if (node != null) { 30 container.add(node.value); 31 preOrderTreeWalk(node.leftChildNode, container); 32 preOrderTreeWalk(node.rightChildNode, container); 33 } 34 } 35 36 /** 37 * 非遞歸實現先序遍歷 38 * @param root 39 * @param container 40 */ 41 public void prePrint2(TreeNode root, ArrayList<Integer> container) { 42 Stack<TreeNode> stack = new Stack<TreeNode>(); 43 while(root != null || !stack.isEmpty()) { 44 if(root != null) { 45 container.add(root.value); 46 stack.push(root); 47 root = root.leftChildNode; 48 } 49 else if(!stack.isEmpty()) { //pNode == null, !stack.isEmpty 50 TreeNode node = stack.pop(); 51 root = node.rightChildNode; 52 } 53 } 54 } 55 56 /** 57 * 遞歸實現中序遍歷 58 * @param node 59 * @param container 60 */ 61 public void midOrderTreeWalk(TreeNode node, ArrayList<Integer> container) { 62 if (node != null) { 63 midOrderTreeWalk(node.leftChildNode, container); 64 container.add(node.value); 65 midOrderTreeWalk(node.rightChildNode, container); 66 } 67 } 68 69 /** 70 * 非遞歸實現中序遍歷 71 * @param root 72 * @param container 73 */ 74 public void inPrint2(TreeNode root, ArrayList<Integer> container) { 75 Stack<TreeNode> stack = new Stack<TreeNode>(); 76 while(root != null || !stack.isEmpty()) { 77 if(root != null) { 78 stack.push(root); 79 root = root.leftChildNode; 80 } else { 81 TreeNode node = stack.pop(); 82 container.add(node.value); 83 root = node.rightChildNode; 84 } 85 } 86 } 87 88 /** 89 * 遞歸實現後序遍歷 90 * @param node 91 * @param container 92 */ 93 public void postOrderTreeWalk(TreeNode node, ArrayList<Integer> container) { 94 if (node != null) { 95 postOrderTreeWalk(node.leftChildNode, container); 96 postOrderTreeWalk(node.rightChildNode, container); 97 container.add(node.value); 98 } 99 } 100 101 /** 102 * 非遞歸實現後序遍歷 103 * @param node 104 * @param container 105 */ 106 public void postPrintTree(TreeNode node, ArrayList<Integer> container) { 107 108 Stack<TreeNode> stack = new Stack<TreeNode>(); 109 TreeNode p = node, prev = node; 110 while(p != null || !stack.isEmpty()) { 111 while(p != null) { 112 stack.push(p); 113 p = p.leftChildNode; 114 } 115 116 if(!stack.isEmpty()) { 117 TreeNode tmp = stack.peek().rightChildNode; 118 if(tmp == null || tmp == prev) { 119 p = stack.pop(); 120 container.add(p.value); 121 prev = p; 122 p = null; 123 } else { 124 p = tmp; 125 } 126 } 127 } 128 129 } 130 131 public void createBinaryTree(int[] data) { 132 if (data != null) { 133 for (int i : data) { 134 insert(i); 135 } 136 } 137 } 138 139 public void insert(int value) { 140 if (root == null) { //當前沒有根節點,則數組中的第一個數是根節點 141 root = new TreeNode(value); 142 } else { 143 TreeNode curNode = root; //根節點 144 TreeNode parentNode; 145 while (true) { 146 parentNode = curNode; //curNode:root 147 if (value < curNode.value) { 148 curNode = curNode.leftChildNode; //小於根節點,就在是root的左孩子結點 149 if (curNode == null) { 150 parentNode.leftChildNode = new TreeNode(value); 151 // parentNode.leftChildNode.leftOrRight = -1; 152 break; 153 } 154 } else { 155 curNode = curNode.rightChildNode; 156 if (curNode == null) { 157 parentNode.rightChildNode = new TreeNode(value); 158 // parentNode.rightChildNode.leftOrRight = 1; 159 break; 160 } 161 } 162 } 163 } 164 ++size; 165 } 166 167 168 public int size() { 169 return this.size; 170 } 171 172 public boolean isEmpty() { 173 return size == 0; 174 } 175 }
測試node
1 package test.tree; 2 3 import java.util.ArrayList; 4 5 public class TestBinTree { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 int[] data = { 21, 25, 16, 32, 22, 19, 13, 20}; 12 BinaryTree bTree = new BinaryTree(); 13 bTree.createBinaryTree(data); 14 ArrayList<Integer> container = new ArrayList<Integer>(); 15 TreeNode root = bTree.getRoot(); 16 container.clear(); 17 bTree.preOrderTreeWalk(root, container); 18 System.out.println("遞歸先序遍歷: " + container); 19 container.clear(); 20 bTree.prePrint2(root, container); 21 System.out.println("非遞歸先序遍歷:"+container); 22 container.clear(); 23 System.out.println("----------------------------------------------"); 24 bTree.midOrderTreeWalk(root, container); 25 System.out.println("遞歸中序遍歷: " + container); 26 container.clear(); 27 bTree.inPrint2(root, container); 28 System.out.println("非遞歸中序遍歷:"+container); 29 container.clear(); 30 System.out.println("----------------------------------------------"); 31 bTree.postOrderTreeWalk(root, container); 32 System.out.println("遞歸後續遍歷: " + container); 33 container.clear(); 34 bTree.postPrintTree(root, container); 35 System.out.println("非遞歸後序遍歷:" + container); 36 37 } 38 }
結果數組
1 遞歸先序遍歷: [21, 16, 13, 19, 20, 25, 22, 32] 2 非遞歸先序遍歷:[21, 16, 13, 19, 20, 25, 22, 32] 3 ---------------------------------------------- 4 遞歸中序遍歷: [13, 16, 19, 20, 21, 22, 25, 32] 5 非遞歸中序遍歷:[13, 16, 19, 20, 21, 22, 25, 32] 6 ---------------------------------------------- 7 遞歸後續遍歷: [13, 20, 19, 16, 22, 32, 25, 21] 8 非遞歸後序遍歷:[13, 20, 19, 16, 22, 32, 25, 21]