圖解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為指向子樹根結點的
(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,並調整鍵值,如下圖
完畢