1. 程式人生 > >圖解B+樹的插入和刪除(一看就懂)

圖解B+樹的插入和刪除(一看就懂)

一,    M階B+樹的定義(M階是指一個節點最多能擁有的孩子數,M>2):

圖1.1 3階B+樹

        (1)根結點只有1個,分支數量範圍[2,m]。

        (2)除根以外的非葉子結點,每個結點包含分支數範圍[[m/2],m],其中[m/2]表示取大於m/2的最小整數。

        (3)所有非葉子節點的關鍵字數目等於它的分支數量。

        (4) 所有葉子節點都在同一層,且關鍵字數目範圍是[[m/2],m],其中[m/2]表示取大於m/2的最小整數。

        (5)所有非葉子節點的關鍵字可以看成是索引部分,這些索引等於其子樹(根結點)中的最大(或最小)關鍵字。例如一個非葉子節點包含資訊: (n,A0,K0, A1,K1,……,Kn,An),其中Ki為關鍵字,Ai為指向子樹根結點的

指標,n表示關鍵字個數。即Ai所指子樹中的關鍵字均小於或等於Ki,而Ai+1所指的關鍵字均大於Ki(i=1,2,……,n)。

        (6)葉子節點包含全部關鍵字的資訊(非葉子節點只包含索引),且葉子結點中的所有關鍵字依照大小順序連結(所以一個B+樹通常有兩個頭指標,一個是指向根節點的root,另一個是指向最小關鍵字的sqt)。

二,    3階B+樹的插入舉例:

l  例1:

往下圖的3階B+樹中插入關鍵字9

首先查詢9應插入的葉節點(最左下角的那一個),插入發現沒有破壞B+樹的性質,完畢。插完如下圖所示:

l  例2:

往下圖的3階B+樹插入20

首先查詢20應插入的葉節點(第二個葉子節點),插入,如下圖

發現第二個葉子節點已經破壞了B+樹的性質,則把之分解成[20 21], [37 44]兩個,並把21往父節點移,如下圖

發現父節點也破壞了B+樹的性質,則把之再分解成[15 21], [44 59]兩個,並把21往其父節點移,如下圖

這次沒有破壞B+樹的性質(如果還是不滿足B+樹的性質,可以遞迴上去,直到滿足為至),插入完畢。

l  例3:

往下圖的3階B+樹插入100

首先查詢100應插入的葉節點(最後一個節點), 插入,如下圖

修改其所有父輩節點的鍵值為100(只有插入比當前樹的最大數大的數時要做此步),如下圖

然後重複Eg.2的方法拆分節點,最後得

三,    3階B+

樹的刪除舉例:

l  例1:

刪除下圖3階B+樹的關鍵字91

首先找到91所在葉節點(最後一個節點),刪除之,如下圖

沒有破壞B+樹的性質,刪除完畢

l  例2:

刪除下圖3階B+樹的關鍵字97

首先找到97所在葉節點(最後一個節點),刪除之,然後修改該節點的父輩的鍵字為91(只有刪除樹中最大數時要做此步),如下圖

l  例3:

刪除下圖3階B+樹的關鍵字51

首先找到51所在節點(第三個節點),刪除之,如下圖

破壞了B+樹的性質,從該節點的兄弟節點(左邊或右邊)借節點44,並修改相應鍵值,判斷沒有破壞B+樹,完畢,如下圖

l  例4:

刪除下圖3階B+樹的關鍵字59

首先找到59所在葉節點(第三個節點),刪除之,如下圖

破壞B+樹性質,嘗試借節點,無效(因為左兄弟節點被借也會破壞B+樹性質),合併第二第三葉節點並調整鍵值,如下圖

完畢。

l  例5:

刪除下圖3階B+樹的關鍵字63

首先找到63所在葉節點(第四個節點),刪除之,如下圖

合併第四五葉節點並調整鍵值,如下圖

發現第二層的第二個節點不滿足B+樹性質,從第二層的第一個節點借59,並調整鍵值,如下圖

完畢