概述
二叉樹是n個有限元素的集合,該集合或者為空、或者由一個稱為根(root)的元素及兩個不相交的、被分別稱為左子樹和右子樹的二叉樹組成,是有序樹。當集合為空時,稱該二叉樹為空二叉樹。在二叉樹中,一個元素也稱作一個結點 。二叉樹(binary tree)是指樹中節點的度不大於2的有序樹,它是一種最簡單且最重要的樹。
二叉樹性質
- 二叉樹的第i層上至多有2i-1(i≥1)個節點。
- 深度為h的二叉樹中至多含有2h-1個節點。
- 若在任意一棵二叉樹中,有n0個葉子節點,有n2個度為2的節點,則必有n0=n2+1。
二叉樹特殊型別
-
滿二叉樹
如果一棵二叉樹只有度為0的結點(葉子節點)和度為2的結點,並且度為0的結點在同一層上,則這棵二叉樹為滿二叉樹。滿二叉樹又是特殊的完全二叉樹。
滿二叉樹除了具備普通二叉樹的性質,還具備以下性質:
- 滿二叉樹中第 i 層的節點數為 2i-1 個。
- 深度為 h 的滿二叉樹必有 2h-1 個節點 ,葉子數為 2h-1。
- 滿二叉樹中不存在度為 1 的節點,每一個分支點中都兩棵深度相同的子樹,且葉子節點都在最底層。
- 具有 n 個節點的滿二叉樹的深度為 log2(n+1)(與第2點對應)。
-
完全二叉樹
深度為h,有n個結點的二叉樹當且僅當其每一個結點都與深度為h的滿二叉樹中編號從1到n的結點一一對應時;簡單來說就是二叉樹中除去最後一層節點為滿二叉樹,且最後一層的結點依次從左到右分佈,則此二叉樹被稱為完全二叉樹。
二叉樹除了滿足普通二叉樹的性質,還具備以下性質:
- 具有n個節點的完全二叉樹的深度為(int)log2n+1。
- 若對一棵有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 }