1. 程式人生 > 其它 >演算法-二叉樹-1

演算法-二叉樹-1

先序遍歷 非遞迴寫法

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

  左子樹與右子樹都是平衡樹