[查詢] B-樹與B+樹
阿新 • • 發佈:2018-12-08
【名稱】B-樹叫“B樹”,中間的”-“不是減號,是一個橫杆,而B+樹,確實就叫“B加樹”,中間是“+”
B樹
介紹
二叉排序樹:
【B樹】可以說是平衡二叉樹的擴充套件,可以有多個子樹
m階B樹de特點
【階數m】一個結點最多有m顆子樹 階數是人為規定的,結構定下去就已經定的
【5階的B樹】
結點的分支個數
- 【根結點】≤2
- ⌈m/2⌉≤【普通結點】≤m
- 【葉子結點】無分支
結點的關鍵字個數
有n個分支的結點(k≤n≤m),有n-1個關鍵字,關鍵字有序排列
- 根結點的k=2: 1≤【關鍵字個數】≤m-1
- 其他結點的k=⌈m/2⌉:⌈m/2⌉-1≤【關鍵字個數】≤m-1
其他
- 結點內關鍵字互不相等
- 葉子結點:葉子結點是最下一層,白線的線,可以用空指標表示,是查詢失敗所到達的位置,實際應用中也有可能掛一些記錄
- 終端結點:是葉子結點的上一層,也就是關鍵字的最下一層(3,4,22,25…那一層)
高度
兩種說法都可以:
- 【3層】不包括葉子結點那一層
- 【4層】包括葉子結點那一層
結點個數
計算整棵樹的結點個數:就要把葉子結點也要包括進去 30個
查詢
與二叉排序樹相似
插入
【結點拆分】5階B樹 5階B樹->5個分支->4個關鍵字->結點中的關鍵字只能4個->超過了,結點拆分
- 結點的關鍵字≥m
- 把位置k=⌈m/2⌉的結點提取出來
- 把k左右邊的關鍵字拆分成兩個
【舉例】四階B樹的插入
刪除
找當前結點的前驅:往左走一步,再一直往右走 找當前結點的後繼:往右走一步,再一直往左走
#define m 5 //階數
刪除的關鍵字:e
e所在結點為A
min_node_num = m/2-1 //普通結點的最小結點數
max_node_num = m-1
if A 是 終端結點:
if 刪除後的關鍵字個數 ≥ min_node_num://例子①:刪除8
直接刪除e
else if 刪除後的關鍵字個數 < min_node_num:
if 兩個兄弟中有一個兄弟的關鍵字個數 > min_node_num: //例子②:刪除15
向其中一個兄弟結點借關鍵字(父親下來,兄弟結點上去,自己刪除)
else if 兩個兄弟結點關鍵字個數都 ≤ min_node_num: //例子③:刪除4
結點合併(父親結點、兄弟結點、自己三者合併)
while 合併後,父親結點的個數 <min_node_num: //迴圈處理到父親結點的個數也滿足要求
if 父親結點不在了: break //父親結點是根結點
繼續結點合併(父親結點、兄弟結點、自己三者合併)
else if A 不是 終端結點: //例子④:刪除16
用該結點的前驅或後繼代替它 //用17代替它
【例子①】刪除8 刪除之後,結點個數還是≥2,依舊滿足條件,直接刪除
【例子②】刪除15 刪除之後,15所在結點數<2,不滿足條件,向兄弟結點借一下 17(父親)下來,18(兄弟)上去,刪除15(自己刪除)
【例子③】刪除4 4刪除後,4所在結點的關鍵字個數<2,不滿足條件 –> 但是兄弟結點的個數又少,借不了 –> 合併
- 先刪除4
- 和關鍵字個數較少的兄弟合併,這裡兩個都可以(這裡與右結點合併)
- 合併之後,父親結點的關鍵字<2,繼續合併,直到父親的結點的關鍵字符合要求
【例子④】刪除16 用16的後繼17代替它
B+樹
B-樹 | B+樹 | |
---|---|---|
示例 | ||
分支個數 | 具有n個關鍵字的結點含有n+1個分支 | 具有n個關鍵字的結點含有n個分支 |
關鍵字個數n | 普通結點:⌈m/2⌉-1≤n≤m-1根結點:1≤n≤m-1 | 普通結點:⌈m/2⌉≤n≤m根結點:2≤n≤m |
葉子結點 | 葉子結點是空指標,但實際應用中也可能掛記錄 | 葉子結點包含資訊,並且包含了全部關鍵字,葉子結點引出的指標指向記錄 |
非葉子結點 | 每個非葉子結點都有記錄 | 只起到了一個索引作用,真正記錄還在最下層(葉子結點)中 |
其他特徵 | 有一個指標p指向關鍵字最小的葉子結點,把所有的葉子結點連成一個線性連結串列 |