資料結構(樹):二叉樹

Yanci丶發表於2021-06-04

概述

  二叉樹是n個有限元素的集合,該集合或者為空、或者由一個稱為根(root)的元素及兩個不相交的、被分別稱為左子樹和右子樹的二叉樹組成,是有序樹。當集合為空時,稱該二叉樹為空二叉樹。在二叉樹中,一個元素也稱作一個結點 。二叉樹(binary tree)是指樹中節點的度不大於2的有序樹,它是一種最簡單且最重要的樹。

二叉樹性質

  • 二叉樹的第i層上至多有2i-1(i≥1)個節點。
  • 深度為h的二叉樹中至多含有2h-1個節點。
  • 若在任意一棵二叉樹中,有n0個葉子節點,有n2個度為2的節點,則必有n0=n2+1。

二叉樹特殊型別

  • 滿二叉樹

  如果一棵二叉樹只有度為0的結點(葉子節點)和度為2的結點,並且度為0的結點在同一層上,則這棵二叉樹為滿二叉樹。滿二叉樹又是特殊的完全二叉樹。

  滿二叉樹除了具備普通二叉樹的性質,還具備以下性質:

  1. 滿二叉樹中第 i 層的節點數為 2i-1 個。
  2. 深度為 h 的滿二叉樹必有 2h-1 個節點 ,葉子數為 2h-1
  3. 滿二叉樹中不存在度為 1 的節點,每一個分支點中都兩棵深度相同的子樹,且葉子節點都在最底層。
  4. 具有 n 個節點的滿二叉樹的深度為 log2(n+1)(與第2點對應)。
  • 完全二叉樹

  深度為h,有n個結點的二叉樹當且僅當其每一個結點都與深度為h的滿二叉樹中編號從1到n的結點一一對應時;簡單來說就是二叉樹中除去最後一層節點為滿二叉樹,且最後一層的結點依次從左到右分佈,則此二叉樹被稱為完全二叉樹。

  二叉樹除了滿足普通二叉樹的性質,還具備以下性質:

  1. 具有n個節點的完全二叉樹的深度為(int)log2n+1。
  2. 若對一棵有n個節點的完全二叉樹進行順序編號(1≤i≤n),那麼,對於編號為i(i≥1)的節點:

    當i=1時,該節點為根,它無雙親節點;

    當i>1時,該節點的雙親節點的編號為i/2;

    若2i≤n,則有編號為2i的左節點,否則沒有左節點;

    若2i+1≤n,則有編號為2i+1的右節點,否則沒有右節點。

二叉樹儲存

  • 順序儲存

  順序儲存適用於完全二叉樹,因為完全二叉樹從根節點往下排,可以看成是連續的節點。

  

  • 鏈式儲存

  

二叉樹遍歷

  • 前序遍歷:根節點-->左子節點-->右子節點

 1     public void preorderTraversal(BinaryTreeNode root){
 2         if (root == null){
 3             return;
 4         }
 5         print(root);
 6         if (root.getLeft() != null){
 7             preorderTraversal(root.getLeft());
 8         }
 9         if (root.getRight() != null){
10             preorderTraversal(root.getRight());
11         }
12     }
  • 中序遍歷

 1     public void inOrderTraversal(BinaryTreeNode root){
 2         if (root == null){
 3             return;
 4         }
 5         if (root.getLeft() != null){
 6             inOrderTraversal(root.getLeft());
 7         }
 8         print(root);
 9         if (root.getRight() != null){
10             inOrderTraversal(root.getRight());
11         }
12     }
  • 後序遍歷

 1     public void postOrderTraversal(BinaryTreeNode root){
 2         if (root == null){
 3             return;
 4         }
 5         if (root.getLeft() != null){
 6             postOrderTraversal(root.getLeft());
 7         }
 8         if (root.getRight() != null){
 9             postOrderTraversal(root.getRight());
10         }
11         print(root);
12     }
  • 層次遍歷

 1     public void levelTraversal(BinaryTreeNode root){
 2         if (root == null){
 3             return;
 4         }
 5         LinkedList<BinaryTreeNode> queue = new LinkedList<BinaryTreeNode>();
 6         queue.offer(root);
 7         while (!queue.isEmpty()){
 8             BinaryTreeNode node = queue.poll();
 9             print(node);
10             if (node.getLeft() != null){
11                 queue.offer(node.getLeft());
12             }
13             if (node.getRight() != null){
14                 queue.offer(node.getRight());
15             }
16         }
17 
18     }

 

相關文章