1. 程式人生 > >【資料結構】B樹和B+樹講解

【資料結構】B樹和B+樹講解

一、B樹

1、B樹的定義
    B樹是一種平衡的多分樹,通常我們說m階的B樹,它必須滿足如下條件:
    (1)每個結點至多有m個子結點;
    (2)除根結點和葉結點外,其它每個結點至少有個子結點;
    (3)若根結點不是葉子結點,則至少有兩個子結點;
    (4)所有的葉結點在同一層;
    (5)有k個子結點的非根結點恰好包含k-1個關鍵碼。

2、B樹的查詢
 

   B樹上的查詢是一個順指標查詢結點和在結點內的關鍵碼中查詢交叉進行的過程。從根結點開始,在結點包含的關鍵碼中查詢給定的關鍵碼,找到則查詢成功;否則確定給定關鍵碼可能在的子樹,重複上面的操作,直到查詢成功或者指標為空為止。
    下圖顯示了在B樹中查詢關鍵碼21的過程。


3、B樹的插入
 

   首先是在恰當的葉子結點中新增關鍵碼,如果該結點中關鍵碼不超過m-1個,則插入成功。否則要把這個結點分裂為兩個。並把中間的一個關鍵碼拿出來插到結點的父結點裡去。父結點也可能是滿的,就需要再分裂,再往上插。最壞的情況,這個過程可能一直傳到根,如果需要分裂根,由於根是沒有父結點的,這時就建立一個新的根結點。插入可能導致B樹朝著根的方向生長。
    下圖顯示了在B樹中插入關鍵碼33的過程。

4、B樹的刪除
    B樹中的刪除操作與插入操作類似,但要稍微複雜些。如果刪除的關鍵碼不在葉結點層,則先把此關鍵碼與它在B樹裡的後繼對換位置,然後再刪除該關鍵碼。如果刪除的關鍵碼在葉結點層,則把它從它所在的結點裡去掉,這可能導致此結點所包含的關鍵碼的個數小於-1。這種情況下,考察該結點的左或右兄弟,從兄弟結點移若干個關鍵碼到該結點中來(這也涉及到它們的父結點中的一個關鍵碼要做相應變化),使兩個結點所含關鍵碼個數基本相同。只有在兄弟結點的關鍵碼個數也很少,剛好等於-1時,這個移動不能進行。這種情況下,要把將刪除關鍵碼的結點,它的兄弟結點及它們的父結點中的一個關鍵碼合併為一個結點。

 

二、B+樹

1、B+樹的概念
    B+樹是B樹的一種變形樹,它與B樹的差異在於:
    有k個子結點的結點必然有k個關鍵碼;
    非葉結點僅具有索引作用,跟記錄有關的資訊均存放在葉結點中。

2、B+樹的查詢
    跟B樹的查詢類似,但是也有不同。由於跟記錄有關的資訊存放在葉結點中,查詢時若在上層已找到待查的關鍵碼,並不停止,而是繼續沿指標向下一直查到葉結點層的關鍵碼。此外,B+樹的所有葉結點構成一個有序連結串列,可以按照關鍵碼排序的次序遍歷全部記錄。上面兩種方式結合起來,使得B+樹非常適合範圍檢索。

3、B+樹的插入
    B+樹的插入與B樹的插入過程類似。不同的是B+樹在葉結點上進行,如果葉結點中的關鍵碼個數超過m,就必須分裂成關鍵碼數目大致相同的兩個結點,並保證上層結點中有這兩個結點的最大關鍵碼。

4、B+樹的刪除
    B+樹中的關鍵碼在葉結點層刪除後,其在上層的複本可以保留,作為一個"分解關鍵碼"存在,如果因為刪除而造成結點中關鍵碼數小於,其處理過程與B樹的處理一樣。

不同於B樹只適合隨機檢索,B+樹同時支援隨機檢索和順序檢索,在實際中應用比較多。