“森林”——數據結構中各種樹的總結

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Jet_Green/article/details/81231219

二叉樹

定義
二叉樹是每個結點最多有兩個子樹的樹結構。
性質
二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點
二叉樹的子樹有左右之分,次序不能顛倒
二叉樹的第i層至多有2^{i-1}個結點
深度爲k的二叉樹至多有2^k-1個結點
對任何一棵二叉樹T,如果其終端結點數爲n0,度爲2的結點數爲n2,則n0=n2+1。

滿二叉樹

定義:
一棵深度爲k,且有2^k-1個節點的二叉樹,稱爲滿二叉樹。
性質
每一層上的節點數都是最大節點數

完全二叉樹

定義
一棵二叉樹中,除最後一層外,若其餘層都是滿的,並且最後一層或者是滿的,或者是在右邊缺少連續若干節點
性質
具有n個節點的完全二叉樹的深度爲log2(n+1)
深度爲k的完全二叉樹,至少有2^(k-1)個節點,至多有2^k-1個節點

線索二叉樹

定義
n個結點的二叉鏈表中含有n+1(2n-(n-1)=n+1)個空指針域。利用二叉鏈表中的空指針域,存放指向結點在某種遍歷次序下的前驅和後繼結點的指針(這種附加的指針稱爲”線索”)。
這種加上了線索的二叉鏈表稱爲線索鏈表,相應的二叉樹稱爲線索二叉樹(Threaded BinaryTree)。根據線索性質的不同,線索二叉樹可分爲前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種。
注意
線索鏈表解決了無法直接找到該結點在某種遍歷序列中的前驅和後繼結點的問題,出現了二叉鏈表找左、右孩子困難的問題。(PS:我也不是很理解,等回頭我理解透了我再專門寫一篇來介紹)

哈夫曼樹(最優二叉樹)

定義
給定n個權值作爲n個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹爲最優二叉樹,也稱爲哈夫曼樹(Huffman Tree)。
性質
哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近
哈夫曼樹的繪製方法參考這篇博客:(https://blog.csdn.net/lzw66666/article/details/78934893

二叉搜索樹/二叉排序樹/二叉查找樹

定義
它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值
性質
它的左、右子樹也分別爲二叉排序樹。

平衡二叉樹

定義
平衡二叉樹又稱AVL樹,它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1
性質
左右兩個子樹都是一棵平衡二叉樹
實現方式
紅黑樹,AVL,替罪羊樹,Treap(樹堆),伸展樹,SBT(自平衡查找樹)

B樹

定義
即爲二叉搜索樹
性質
所有非葉子結點至多擁有兩個兒子(Left和Right);
所有結點存儲一個關鍵字;
非葉子結點的左指針指向小於其關鍵字的子樹,右指針指向大於其關鍵字的子樹;
搜索方法
B樹的搜索,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中;
否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入
右兒子;如果左兒子或右兒子的指針爲空,則報告找不到相應的關鍵字;

B-樹

定義
是一種多路搜索樹
性質
1.定義任意非葉子結點最多隻有M個兒子;且M>2;
2.根結點的兒子數爲[2, M];
3.除根結點以外的非葉子結點的兒子數爲[M/2, M];
4.每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
5.非葉子結點的關鍵字個數=指向兒子的指針個數-1;
6.非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的
子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;
8.所有葉子結點位於同一層;
搜索
從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,如果
命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指針爲
空,或已經是葉子結點;
特性
1.關鍵字集合分佈在整顆樹中;
2.任何一個關鍵字出現且只出現在一個結點中;
3.搜索有可能在非葉子結點結束;
4.其搜索性能等價於在關鍵字全集內做一次二分查找;
5.自動層次控制;
B+樹
定義
B+樹是B-樹的變體,也是一種多路搜索樹
性質
1.其定義基本與B-樹同,除了:
2.非葉子結點的子樹指針與關鍵字個數相同;
3.非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間)
5.爲所有葉子結點增加一個鏈指針;
6.所有關鍵字都在葉子結點出現
特性
1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好
是有序的;
2.不可能在非葉子結點命中;
3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;
4.更適合文件索引系統;
分裂
當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據
複製到新結點,最後在父結點中增加新結點的指針;B+樹的分裂隻影響原結點和父
結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;

B*樹

定義
是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;
性質
B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3
(代替B+樹的1/2)
分裂
當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分
數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字
(因爲兄弟結點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之
間增加新結點,並各複製1/3的數據到新結點,最後在父結點增加新結點的指針;
所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;

紅黑樹

定義
是一種自平衡二叉查找樹,典型的用途是實現關聯數組。
性質
性質1. 節點是紅色或黑色。
性質2. 根節點是黑色。
性質3 每個葉節點(NIL節點,空節點)是黑色的。
性質4 每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
性質5. 從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章