1. 程式人生 > >B-樹特徵及插入刪除操作總結

B-樹特徵及插入刪除操作總結

一. B-樹特徵和基本概念:

B-樹中所有結點孩子結點個數的最大值是B-樹的階。

對於一個 m 階的B-樹(為了查詢效率考慮,要求m >= 3):

結構要求:

1. 根節點至少有2個分支,1個關鍵字 

2. 非根結點至少有 m/2(向上取整)個分支,(m/2) - 1 個關鍵字。

3. 所有結點最多有 m 個分支,m - 1 個關鍵字。(與B+樹的區別)

特點:

1. 有 n 個分支的結點有 n - 1 個關鍵字 ,他們按遞增順序排列。

2. 結點內個關鍵字互不相等且按從小到大排列。

3. 各個底層結點是葉結點,他們處於同一層;葉結點下面是失敗結點(可以用空指標表示),是查詢失敗到達的位置。

結構:

n k1 k2 …… kn
p0 p1 p2 …… pn
其中,n為該結點中關鍵字的個數;ki(1 <= i <= n)為該節點的關鍵字且滿足 ki < ki+1;pi(0 <= i <= n)為該結點的孩子結點指標且滿足pi(1 <= i <= n-1)所指結點上的關鍵字大於ki 且小於ki+1,p0所指結點上的關鍵字小於k1,pn所指結點上的關鍵字大於kn。

(注:B-樹是平衡m 叉查詢樹,但限制更強,要求所有葉節點在同一層。)

二. B-樹查詢操作:

特點:是二叉排序樹的擴充套件,二叉排序樹是二路查詢,B-樹是多路查詢。

            節點內進行查詢的時候除了順序查詢之外,還可以用折半查詢來提高效率。

三. B-樹插入操作:

首先:插入位置一定在葉結點上!

注意:m階B-樹關鍵字個數範圍是(m/2)-1(向上取整)~ m-1

過程:

1. 按照B-樹的查詢方法找到插入位置(一定在葉節點上),然後直接插入。

2. 插入後檢查被插入結點內關鍵字的個數:

     1)如果關鍵字個數大於m-1,則需要進行拆分。進行拆分時,結點內的關鍵字若已經有m個,此時取出第 m/2 (向上取整) 個關鍵字

 2)並將第 1~(m/2) -1個關鍵字和第(m/2)+1~m個關鍵字(即第m/2關鍵字的左右不分)做成兩個結點連線在第 m/2 個關鍵字左右的指標上

     3)並將第m/2個關鍵字插入其父節點相應的位置中

     4)如果在其父結點內又出現了關鍵字個數超出規定範圍的情況,則繼續進行拆分操作。(這就是插入結點所引起的連鎖反應

特點:插入操作只會是的B-樹逐漸變高而不會改變葉子結點在同一層的特性。

四. B-樹刪除操作:

分兩種情況:

(一)刪除結點在葉子結點上

1.  結點內的關鍵字個數大於m/2(上取整)-1,可以直接刪除(大於關鍵字個數下限,刪除不影響B-樹特性)

2.  結點內的關鍵字個數等於m/2(上取整)-1(等於關鍵字個數下限,刪除後將破壞B-shu特性),此時需觀察該節點左右兄弟結點的關鍵字個數:

   1)如果其左右兄弟結點中存在關鍵字個數大於m/2-1的結點,則從關鍵字個數大於m/2-1的兄弟結點中借關鍵字:

採用覆蓋操作:用需刪除結點的父節點關鍵字覆蓋需刪除結點,再用關鍵字個數大於m/2-1的兄弟結點借關鍵字覆蓋父節點,在刪除原兄弟結點的借關鍵字。

    2) 如果其左右兄弟結點中不存在關鍵字個數大於m/2-1的結點,這是需要進行結點合併:

          將其父結點中的關鍵字拿到下一層,與該節點的左右兄弟結點的所有關鍵字合併

    3)如果出現2所述的情況,會使得其父節點中關鍵字個數少於規定個數,出現這種情況時需要對其父結點繼續進行合併操作。(這就是由於刪除結點引起的連鎖反應

(二)刪除結點在非葉子結點上

1. 首先要將其轉化成在葉子節點上,再按上述(一)進行刪除操作

2. 轉化過程:

  1)找到相鄰關鍵字:即需刪除關鍵字的左子樹中的最大關鍵字或右子樹中的最小關鍵字(可以先到左子樹,再一直按右指標往下找;或在右子樹中,按左指標往下找)

  2)用相鄰關鍵字來覆蓋需刪除的非葉子節點關鍵字,在刪除原相鄰關鍵字。