基本概念
鏈表、棧和隊列都是一對一的線性結構,樹是一對多的線性結構。
「一對多」就是指一個元素只能有一個前驅,但可以有多個後繼。
結點擁有的子樹數被稱爲結點的度(Degree)。度爲0的結點稱爲葉節點(Leaf)或終端結點,度不爲0的結點稱爲分支結點。除根結點外,分支結點也被稱爲內部結點。結點的子樹的根稱爲該結點的孩子(Child),該結點稱爲孩子的雙親或父結點。同一個雙親的孩子之間互稱爲兄弟。
樹的度是樹中各個結點度的最大值。
結點的層次(Level) 從根開始定義起,根爲第一層,根的孩子爲第二層。雙親在同一層的結點互爲堂兄弟。樹中結點的最大層次稱爲樹的深度(Depth)或高度。如果將樹中結點的各個子樹看成從左到右是有次序的,不能互換的,則稱該樹爲有序樹,否則稱爲無序樹。
森林是m(m>=0)棵互不相交的樹的集合。
二叉樹
二叉樹(Binary Tree) 是每個節點最多有兩個子樹的樹結構。通常子樹被稱作左子樹(left subtree) 和 右子樹(right subtree) 。
二叉樹的特點:
- 二叉樹不存在度大於2的結點。
- 二叉樹的子樹有左右之分,次序不能顛倒。
如下圖中,樹1和樹2是同一棵樹,但它們是不同的二叉樹。
斜樹
所有的結點都只有左子樹的二叉樹叫左斜樹,所有的結點都只有右子樹的二叉樹叫右斜樹,這兩者統稱爲斜樹。
斜樹每一層只有一個結點,結點的個數與二叉樹的深度相同。
其實斜樹就是線性表結構。
滿二叉樹
在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有葉子都在同一層上,這樣的二叉樹稱爲滿二叉樹。
滿二叉樹具有如下特點:
- 葉子只能出現在最下一層
- 非葉子結點的度一定是2
- 同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多。
完全二叉樹
若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,並且葉子結點都是從左到右依次排布,這就是完全二叉樹。
完全二叉樹的特點:
- 葉子結點只能出現在最下兩層
- 最下層葉子在左部並且連續
- 同樣結點數的二叉樹,完全二叉樹的深度最小
平衡二叉樹
平衡二叉樹又被稱爲AVL樹(區別於AVL算法),它是一棵二叉排序樹,且具有以下性質:
- 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹
- 非葉子節值大於左邊子節點、小於右邊子節點;
- 沒有值相等重複的節點;
紅黑樹
因爲平衡二叉樹查詢性能和樹的層級(h高度)成反比,h值越小查詢越快、爲了保證樹的結構左右兩端數據大致平衡降低二叉樹的查詢難度一般會採用一種算法機制實現節點數據結構的平衡,實現了這種算法就有紅黑樹。
紅黑樹的應用比較廣泛,主要是用它來存儲有序的數據,它的時間複雜度是O(lgn),效率非常之高。例如,Java集合中的TreeSet和TreeMap。
紅黑樹的特性:
- 每個節點或者是黑色,或者是紅色。
- 根節點是黑色。
- 每個葉子節點(NIL)是黑色。注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點
- 如果一個節點是紅色的,則它的子節點必須是黑色的。
- 從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。
B+樹
B+樹充分的利用了節點的空間,讓查詢速度更加穩定,其速度完全接近於二分法查找。
例如MySQL的數據庫索引查找:
- B+樹的非葉子節點不保存關鍵字記錄的指針,這樣使得B+樹每個節點所能保存的關鍵字大大增加;
- B+樹葉子節點保存了父節點的所有關鍵字和關鍵字記錄的指針,每個葉子節點的關鍵字從小到大鏈接;
- B+樹的根節點關鍵字數量和其子節點個數相等;
- B+的非葉子節點只進行數據索引,不會存實際的關鍵字記錄的指針,所有數據地址必須要到葉子節點才能獲取到,所以每次數據查詢的次數都一樣;