學習了樹的結構類型后,主要對各種樹類型進行匯總總結
1 樹類型
樹中的基本概念:https://jingzh.blog.csdn.net/article/details/107128291
樹類型概述:
二叉樹,完全二叉樹,滿二叉樹,二叉排序樹,平衡二叉樹,紅黑樹,B樹,B+樹,B*樹
1.1 二叉樹
二叉樹:二叉樹是每個節點最多有兩個子樹的樹結構;
是n(n>=0)
個結點的有限集合,它或者是空樹(n=0),或者是由一個根結點及兩顆互不相交的、分別稱為左子樹和右子樹的二叉樹所組成
二叉樹特點:
- 每個結點最多有兩顆子樹,所以二叉樹中不存在度(
結點
擁有的子樹數目
稱為結點的度
)大於2的結點 - 左子樹和右子樹是有順序的,次序不能任意顛倒
- 即使樹中某結點只有一棵子樹,也要區分它是左子樹還是右子樹
1.2 完全二叉樹
完全二叉樹:除最后一層外,每一層上的結點數均達到最大值;在最后一層上只缺少右邊的若干結點
完全二叉樹特點:
- 葉子結點只能出現在最下層和次下層。
- 最下層的葉子結點集中在樹的左部。
- 倒數第二層若存在葉子結點,一定在右部連續位置。
- 如果結點度為1,則該結點只有左孩子,即沒有右子樹。
- 同樣結點數目的二叉樹,完全二叉樹深度最小
1.3 滿二叉樹
除最后一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹
滿二叉樹特點:
- 葉子只能出現在最下一層。出現在其它層就不可能達成平衡。
- 非葉子結點的度(
結點
擁有的子樹數目
稱為結點的度
)一定是2 - 在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子數最多
1.4 二叉搜索樹(二叉排序樹、二叉查找樹)
二叉排序樹:可以為空樹,或者是具備如下性質:若它的左子樹不空,則左子樹上的所有結點的值均小於根節點的值;若它的右子樹不空,則右子樹上的所有結點的值均大於根節點的值,左右子樹分別為二叉排序樹。
如下圖所示:
但是還有一種特殊情況:
這種情況下,二叉搜索樹已經變更為鏈表,搜索一個元素的時間復雜度也變成了O(n)
出現這種情況的原因是二叉搜索樹沒有自平衡的機制,所以就有了平衡二叉樹
1.5 平衡二叉樹
平衡二叉樹是一種概念,是二叉查找樹的一個進化體,它有幾種實現方式:紅黑樹
、AVL樹
它是一個空樹或它的左右兩個子樹的高度差的絕對值不超過1
,並且左右兩個子樹都是平衡二叉樹,如果插入或者刪除一個節點使得高度之差大於1,就要進行節點之間的旋轉,將二叉樹重新維持在一個平衡狀態。
這個方案很好的解決了二叉查找樹退化成鏈表的問題,把插入,查找,刪除的時間復雜度最好情況和最壞情況都維持在O(logN)。但是頻繁旋轉會使插入和刪除犧牲掉O(logN)
左右的時間,不過相對二叉查找樹來說,時間上穩定了很多
1.6 紅黑樹
1.6.1 紅黑樹概念
紅黑樹是一種平衡二叉查找樹的變體,它的左右子樹高差有可能大於1
,所以紅黑樹不是嚴格意義上的平衡二叉樹(AVL
),但對之進行平衡的代價較低, 其平均統計性能要強於 AVL
紅黑樹的特性:
- 每個節點或者是黑色,或者是紅色
- 根節點是黑色
- 每個葉結點是黑色
- 如果一個節點是紅色的,則它的子節點必須是黑色的,紅色節點的孩子和父親都不能是紅色。從每個葉子到根的所有路徑上不能有兩個連續的紅色節點,任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。確保沒有一條路徑會比其他路徑長出倆倍。因而,紅黑樹是相對接近平衡的二叉樹,並不是一個完美平衡二叉查找樹
1.6.2 紅黑樹和AVL樹區別
紅黑樹和AVL
樹區別
RB-Tree
和AVL
樹作為二叉搜索樹(BBST
),其實現的算法時間復雜度相同,AVL
作為最先提出的BBST
,貌似RB-tree
實現的功能都可以用AVL
樹是代替,那么為什么還需要引入RB-Tree
呢
- 紅黑樹不追求
完全平衡
,即不像AVL
那樣要求節點的高度差的絕對值
<= 1,它只要求部分達到平衡,但是提出了為節點增加顏色,紅黑是用非嚴格的平衡來換取增刪節點時候旋轉次數的降低,任何不平衡都會在三次旋轉
之內解決,而AVL
是嚴格平衡樹,因此在增加或者刪除節點的時候,根據不同情況,旋轉的次數比紅黑樹要多 - 就插入節點導致樹失衡的情況,
AVL
和RB-Tree
都是最多兩次樹旋轉來實現復衡rebalance
,旋轉的量級是O(1)
- 刪除節點導致失衡,
AVL
需要維護從被刪除節點到根節點root
這條路徑上所有節點的平衡,旋轉的量級為O(logN)
,而RB-Tree
最多只需要旋轉3次實現復衡,只需O(1)
,所以說RB-Tree
刪除節點的rebalance
的效率更高,開銷更小 AVL
的結構相較於RB-Tree
更為平衡,插入和刪除引起失衡,RB-Tree
復衡效率更高;當然,由於AVL
高度平衡,因此AVL的Search效率更高
- 針對插入和刪除節點導致失衡后的
rebalance
操作,紅黑樹能夠提供一個比較便宜
的解決方案,降低開銷,是對search
,insert
,以及delete
效率的折衷,總體來說,RB-Tree
的統計性能高於AVL
- 故引入
RB-Tree
是功能、性能、空間開銷的折中結果
AVL更平衡,結構上更加直觀,時間效能針對讀取而言更高;維護稍慢,空間開銷較大。
紅黑樹,讀取略遜於AVL
,維護強於AVL
,空間開銷與AVL
類似,內容極多時略優於AVL,維護優於AVL。
總結:實際應用中,若搜索的次數遠遠大於插入和刪除,那么選擇AVL
,如果搜索,插入刪除次數幾乎差不多,應該選擇RB-Tree
1.7 B樹類型
1.7.1 B樹(B-樹、B_樹)
一種平衡的多叉樹
,稱為B樹
(或B-樹
、B_樹
,B:balanced
說明B樹和平衡樹有關系)
一棵M階B樹
(M階數:表示此樹的結點最多有多少個孩子結點(子樹))是一棵平衡的m路
搜索樹。它或者是空樹,或者是滿足下列性質的樹:
- 根結點至少有兩個子女;
- 每個非根節點所包含的關鍵字個數 j 滿足:┌m/2┐ - 1 <= j <= m - 1;
- 除根結點以外的所有結點(不包括葉子結點)的度數正好是關鍵字總數加1,故內部子樹個數 k 滿足:┌m/2┐ <= k <= m ;
- 所有的葉子結點都位於同一層。
簡單理解為:平衡多叉樹為B樹(每一個子節點上都是有數據的),葉子節點之間無指針相鄰
B樹的搜索,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那么就命中;否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入右兒子;如果左兒子或右兒子的指針為空,則報告找不到相應的關鍵字;重復,直到所對應的兒子指針為空,或已經是葉子結點
如果B樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那么B樹的搜索性能逼近二分查找;但它比連續內存空間的二分查找的優點是,改變B樹結構(插入與刪除結點)不需要移動大段的內存數據,甚至通常是常數開銷;但B樹在經過多次插入與刪除后,有可能導致不同的結構
B-樹的特性:
- 關鍵字集合分布在整顆樹中;
- 任何一個關鍵字出現且只出現在一個結點中;
- 搜索有可能在非葉子結點結束;
- 其搜索性能等價於在關鍵字全集內做一次二分查找;
- 自動層次控制;
由於M階B樹每個結點最少M/2個結點的限制,是為了最大限度的減少查找路徑的長度,提供查找效率
1.7.2 B+樹
B+樹是B樹的一種變形形式,B+樹上的葉子結點存儲關鍵字以及相應記錄的地址,葉子結點以上各層作為索引使用。一棵m階的B+樹定義如下
- 每個結點至多有m個子女;
- 除根結點外,每個結點至少有[m/2]個子女,根結點至少有兩個子女;
- 有k個子女的結點必有k個關鍵字
B+樹的查找與B樹不同,當索引部分某個結點的關鍵字與所查的關鍵字相等時,並不停止查找,應繼續沿着這個關鍵字左邊的指針向下,一直查到該關鍵字所在的葉子結點為止。
1.7.3 B*樹
B*樹
是B+樹
的變體,在B+樹
的非根和非葉子結點再增加指向兄弟的指針;
B*樹
定義了非葉子結點關鍵字個數至少為(2/3)*M
,即塊的最低使用率為2/3
(代替B+樹的1/2);
B+樹
的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹
的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
B*樹
的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各復制1/3的數據到新結點,最后在父結點增加新結點的指針;所以,B*樹
分配新結點的概率比B+樹
要低,空間使用率更高
B樹
類型總結:
二叉搜索樹
:二叉樹,每個結點只存儲一個關鍵字,等於則命中,小於走左結點,大於走右結點;B樹(B-樹)
:多路搜索樹,每個結點存儲M/2到M(M是指M階B樹)個關鍵字,非葉子結點存儲指向關鍵字范圍的子結點;所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;B+樹
:在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中;B*樹
:在B+樹基礎上,為非葉子結點也增加鏈表指針,將結點的最低利用率從1/2提高到2/3