演算法-二叉樹-1
阿新 • • 發佈:2021-07-14
先序遍歷 非遞迴寫法
1. 先入棧 彈出 列印
2. 然後先壓入右節點 再壓入左節點
3. 重複
1 public void printPre(TreeNode node) { 2 Stack<TreeNode> stack = new Stack<>(); 3 stack.push(node); 4 while (!stack.isEmpty()) { 5 TreeNode pop = stack.pop(); 6 System.out.println(pop.value);7 if (pop.right != null) { 8 stack.push(pop.right); 9 } 10 if (pop.left != null) { 11 stack.push(pop.left); 12 } 13 14 } 15 }
中序遍歷 非遞迴寫法
1. 先入棧所有的左子節點
2. 彈出節點 輸出 並壓入彈出節點的右節點的左子節點
1 public void printMid(TreeNode node) {2 Stack<TreeNode> stack = new Stack<>(); 3 while (node != null || !stack.isEmpty()) { 4 if (node != null) { 5 stack.push(node); 6 node = node.left; 7 } else { 8 TreeNode pop = stack.pop(); 9 System.out.println(pop.value);10 node = pop.right; 11 } 12 } 13 14 }
後序遍歷 非遞迴寫法
1. 兩個棧stack/result
2. 頭節點陷入stack棧
3. 彈出放入result棧
4. stack棧壓入stack的左子節點 右子節點
5. 知道stack為空 依次彈出result為後序
1 public void printAfter(TreeNode node){ 2 Stack<TreeNode> stack = new Stack<>(); 3 Stack<TreeNode> result = new Stack<>(); 4 stack.push(node); 5 while (!stack.isEmpty()){ 6 TreeNode pop = stack.pop(); 7 result.push(pop); 8 if (pop.left != null){ 9 stack.push(pop.left); 10 } 11 if (pop.right != null){ 12 stack.push(pop.right); 13 } 14 } 15 while (!result.isEmpty()){ 16 TreeNode pop = result.pop(); 17 System.out.print(pop.value+" "); 18 } 19 20 }
寬度優先遍歷
使用一個佇列,先放入頭節點 彈出列印 然後先放左後放右
1 public int width(TreeNode node){ 2 Queue<TreeNode> queue = new LinkedList<>(); 3 queue.offer(node); 4 TreeNode nodeCurEnd = node; 5 TreeNode nextEnd = null; 6 int max = Integer.MIN_VALUE; 7 int curLevelNodes = 0; 8 while (!queue.isEmpty()){ 9 TreeNode poll = queue.poll(); 10 curLevelNodes++; 11 if (poll.left != null){ 12 queue.offer(poll.left); 13 nextEnd = poll.left; 14 } 15 if (poll.right != null){ 16 queue.offer(poll.right); 17 nextEnd = poll.right; 18 } 19 if (poll == nodeCurEnd){ 20 max = Math.max(max,curLevelNodes); 21 curLevelNodes = 0; 22 nodeCurEnd = nextEnd; 23 } 24 } 25 return Math.max(max,curLevelNodes); 26 }
演算法題:
1. 判斷是否是搜尋二叉樹
中序遍歷 有序才是搜尋二叉樹
2. 判斷是否是完全二叉樹
寬度遍歷 滿足兩個條件,1. 不能只有右孩子沒有左孩子節點 2. 當第一次出現葉子節點的時候 後面的節點必須都是葉子節點
3. 判斷是否是滿二叉樹
1. 滿二叉樹節點個數 = 2 * 最大深度 -1
4. 判斷是否是平衡二叉樹
對於任何子樹來說 左數的高度與右樹的高度相差不超過1
左子樹與右子樹都是平衡樹