數據結構中關於樹的總結

前言

一直對數據結構中的各種樹沒有分清楚,最近下決心學習總結下來。
首先需要了解二叉樹,滿二叉樹,完全二叉樹等概念,這些在本文不做贅述。

二叉排序樹

又名二叉搜索樹/二叉查找樹。它的特性是:

  • 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
  • 若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
  • 左、右子樹也分別爲二叉排序樹;

二叉查找樹的性質

對二叉查找樹進行中序遍歷,即可得到有序的數列。

時間複雜度

它和二分查找一樣,插入和查找的時間複雜度均爲O(logn),但是在最壞的情況下仍然會有O(n)的時間複雜度。原因在於插入和刪除元素的時候,樹沒有保持平衡。我們追求的是在最壞的情況下仍然有較好的時間複雜度,這就是平衡查找樹設計的初衷。
二叉查找樹的高度決定了二叉查找樹的查找效率。

AVL樹

  • 要麼是棵空樹,要麼其根節點左右子樹的深度之差的絕對值不超過1;
  • 其左右子樹也都是平衡二叉樹;

AVL樹是最先發明的自平衡二叉查找樹。包括兩種旋轉:

  • 單旋轉
  • 雙旋轉

紅黑樹

另一種平衡二叉樹

  • 節點是紅色或者黑色
  • 根是黑色
  • 所有葉子節點都是黑色(葉子節點是NIL節點)
  • 每個紅色節點必須有兩個黑色的子節點。
  • 從任一節點到其每個葉子的所有簡單路徑都包含相同數目的黑色節點。

基本操作

  • 左旋
  • 右旋

B樹

B樹也是一種用於查找的平衡樹,但是它不是二叉樹。
B樹的定義:B樹(B-tree)是一種樹狀數據結構,能夠用來存儲排序後的數據。這種數據結構能夠讓查找數據、循序存取、插入數據及刪除的動作,都在對數時間內完成。B樹,概括來說是一個一般化的二叉查找樹,可以擁有多於2個子節點。與自平衡二叉查找樹不同,B-樹爲系統最優化大塊數據的讀和寫操作。B-tree算法減少定位記錄時所經歷的中間過程,從而加快存取速度。這種數據結構常被應用在數據庫和文件系統的實作上。

在B樹中查找給定關鍵字的方法是,首先把根結點取來,在根結點所包含的關鍵字K1,…,Kn查找給定的關鍵字(可用順序查找或二分查找法),若找到等於給定值的關鍵字,則查找成功;否則,一定可以確定要查找的關鍵字在Ki與Ki+1之間,Pi爲指向子樹根節點的指針,此時取指針Pi所指的結點繼續查找,直至找到,或指針Pi爲空時查找失敗。

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) 所有葉子結點位於同一層;

B+樹

B+樹是B-樹的變體,也是一種多路搜索樹:

  • 1.其定義基本與B-樹同,除了:

  • 2.非葉子結點的子樹指針與關鍵字個數相同;

  • 3.非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹

(B-樹是開區間);

  • 5.爲所有葉子結點增加一個鏈指針;
  • 6.所有關鍵字都在葉子結點出現;
    如:(M=3)

B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在

非葉子結點命中),其性能也等價於在關鍵字全集做一次二分查找;

B+的特性:

  • 1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好

是有序的;

  • 2.不可能在非葉子結點命中;

  • 3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲

(關鍵字)數據的數據層;

  • 4.更適合文件索引系統;

B*樹

是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;

B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3

(代替B+樹的1/2);
B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據

複製到新結點,最後在父結點中增加新結點的指針;B+樹的分裂隻影響原結點和父

結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分

數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字

(因爲兄弟結點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之

間增加新結點,並各複製1/3的數據到新結點,最後在父結點增加新結點的指針;
所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;

參考資料

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