1. 程式人生 > >對幾種二叉樹的簡單理解

對幾種二叉樹的簡單理解

二叉搜尋樹(BST best search tree):

右子節點的關鍵值總是大於或者等於此節點的關鍵值,左子節點的關鍵值總是小於該節點的關鍵值。

這樣在檢索的時候能實現二分法的檢索,時間複雜度log2(n)

可見BST樹的形成,使我們在儲存的時候,就選擇性的儲存,去塑造一個二叉搜尋樹。可見資料有效能的檢索的前提是我們有意願的塑造一個規整的資料結構!!這句話不僅僅體現在資料結構上,更是體現在我們的演算法上,演算法就是包含資料結構的。在資料庫系統中,如何塑造有效的查詢或者先關的條件查詢,這種思維認識也是體現的很明顯。

二叉平衡樹(AVL  Adelson-Velskii和Landis於1962年首先提出的,所以又稱為AVL樹

):

定義:左右子樹的度的差值的絕對值不超過1. 且左右子樹也是一個平衡樹。且平衡樹具備BST的特性。

說白了平衡樹是嚴格上的BST樹,嚴格在於要求樹的度達到最小值。儘量在要求節點關鍵值右大左小的同時,要求根節點的關鍵值位於一堆數字的中間,而且依次類推。

這樣可以最大限度達到log2(n)的時間複雜度。

可見這裡又再次體現我們如果實現有效快速的查詢檢索,就要儘量在儲存資料的時候,做到資料的合理有序儲存化,也就是在儲存的時候我們需要耗費一定的時間。也就是將一定的時間複雜度分配給儲存的過程。

B-樹 :是一種多路搜尋樹(並不是二叉的):(資料庫索引就是使用這類樹,如B-,B+,B*,說白了就是多路搜尋)

       1.定義任意非葉子結點最多隻有M個兒子;且M>2;(這句話倒不如這麼說:非葉子節點的兒子數可以是0,1,2......N,不包括根節點)

       2.根結點的兒子數為[2, M];(節點數可以是2,3,4......)(M是節點關鍵字數,那麼子節點的數是小於或者等於或者是關鍵字數+1;這三種條件。為什麼這樣,是因為這樣才能使得關鍵字數和子節點分支對應上,才能構成條件分支多路檢索,每一個關鍵字數值成為訪問具體的子節點的條件。當子節點數=關鍵字數+1,相當於n個模板造就n+1的分割空間)

       3.除根結點以外的非葉子結點的兒子數為[M/2, M]

       4.

每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字和最多M-1個關鍵字,那麼總有節點數小於等於關鍵字數或者為關鍵字數+1)

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


   M=3

B-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點.

B-樹的特性:

       1.關鍵字集合分佈在整顆樹中;
       2.任何一個關鍵字出現且只出現在一個結點中;
       3.搜尋有可能在非葉子結點結束;
       4.其搜尋效能等價於在關鍵字全集內做一次二分查詢;
       5.自動層次控制;
       由於限制了除根結點以外的非葉子結點,至少含有M/2個兒子,確保了結點的至少

利用率,其最底搜尋效能為:


其中,M為設定的非葉子結點最多子樹個數,N為關鍵字總數;所以B-樹的效能總是等價於二分查詢(與M值無關),也就沒有B樹平衡的問題; 由於M/2的限制,在插入結點時,如果結點已滿,需要將結點分裂為兩個各佔M/2的結點;刪除結點時,需將兩個不足M/2的兄弟結點合併.

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+樹要低,空間使用率更高。

M=3