[JAVA] 通過陣列以完全二元樹(complete binary tree)形式前序,中序,後序遍歷

完滿(Full)二元樹vs 完全(Complete)二元樹vs 完美(Perfect)二元樹

圖片來源: http://www.csie.ntnu.edu.tw/~u91029/BinaryTree2.png

 

 


 

二元樹說明:

完美二元樹

Perfect Binary Tree

Every node except the leaf nodes have two children and every level (last level too) is completely filled.除了葉子結點之外的每一個結點都有兩個孩子,每一層(當然包含最後一層)都被完全填充。

完全二元樹

Complete Binary Tree

Every level except the last level is completely filled and all the nodes are left justified.除了最後一層之外的其他每一層都被完全填充,並且所有結點都保持向左對齊。

完滿二元樹

Full/Strictly Binary Tree

Every node except the leaf nodes have two children.除了葉子結點之外的每一個結點都有兩個孩子結點。

  •   完美(Perfect)二元樹一定是完全(Complete)二元樹,但完全(Complete)二元樹不一定是完美(Perfect)二元樹。
  • 完美(Perfect)二元樹一定是完滿(Full)二元樹,但完滿(Full)二元樹不一定是完美(Perfect)二元樹。
  • 完全(Complete)二元樹可能是完滿(Full)二元樹,完滿(Full)二元樹也可能是完全(Complete)二元樹。
  • 既是完全(Complete)二元樹又是完滿(Full)二元樹也不一定就是完美(Perfect)二元樹。

參考來源:https://www.cnblogs.com/idorax/p/6441043.html

 

image-20201201224945859
二元樹轉陣列之索引分布示意圖:二元樹向左遍歷( 父結點之左子結點索引為 2 * n  + 1; 父結點之右子結點索引為2 * n + 2 )
package utitled;

// 通過陣列以二元樹形式進行前序, 中序, 後續遍歷
public class ArrBinaryTreeTraversalDemo {

  public static void main(String[] args) {
    int[] arr = {1,2,3,4,5,6,7};
    ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
    // 從根結點開始遍歷
    int rootInx = 0;
    System.out.println("前序");
    arrBinaryTree.preOrder(rootInx);// 1,2,4,5,3,6,7
    System.out.println("\n中序");
    arrBinaryTree.inOrder(rootInx);// 4,2,5,1,6,3,7
    System.out.println("\n後序");
    arrBinaryTree.postOrder(rootInx);// 4,5,2,6,7,3,1
  }


}

class ArrBinaryTree {
  private int[] arr;

  public ArrBinaryTree(int[] arr) {
    this.arr = arr;
  }

  /**
   * 將陣列前序遍歷
   * @param index 陣列索引
   */
  public void preOrder(int index) {
    // 先判斷index是否越界
    if (arr == null && arr.length == 0) {
      System.out.println("陣列為空,無法遍歷");
      return;
    }
    if (index >= arr.length) {
      return;
    }

    // 輸出當前node
    System.out.print(arr[index]+"\t");
    // 向左前序遍歷
    preOrder(2 * index + 1);
    // 向右前序遍歷
    preOrder(index * 2 + 2);
  }

  /**
   * 將陣列中序遍歷
   * @param index 陣列索引
   */
  public void inOrder(int index) {
    // 先判斷index是否越界
    if (arr == null && arr.length == 0) {
      System.out.println("陣列為空,無法遍歷");
      return;
    }
    if (index >= arr.length) {
      return;
    }

    // 向左前序遍歷
    inOrder(2 * index + 1);
    // 輸出當前node
    System.out.print(arr[index]+"\t");
    // 向右前序遍歷
    inOrder(index * 2 + 2);
  }

  /**
   * 將陣列後序遍歷
   * @param index 陣列索引
   */
  public void postOrder(int index) {
    // 先判斷index是否越界
    if (arr == null && arr.length == 0) {
      System.out.println("陣列為空,無法遍歷");
      return;
    }
    if (index >= arr.length) {
      return;
    }

    // 向左前序遍歷
    postOrder(2 * index + 1);
    // 向右前序遍歷
    postOrder(index * 2 + 2);
    // 輸出當前node
    System.out.print(arr[index]+"\t");
  }
}



 

如有敘述錯誤,還請不吝嗇留言指教,thanks!