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 |
(注: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)用相鄰關鍵字來覆蓋需刪除的非葉子節點關鍵字,在刪除原相鄰關鍵字。