1. 程式人生 > >[查詢] B-樹與B+樹

[查詢] B-樹與B+樹

【名稱】B-樹叫“B樹”,中間的”-“不是減號,是一個橫杆,而B+樹,確實就叫“B加樹”,中間是“+”

B樹

介紹

二叉排序樹:

這裡寫圖片描述

【B樹】可以說是平衡二叉樹的擴充套件,可以有多個子樹

這裡寫圖片描述

m階B樹de特點

【階數m】一個結點最多有m顆子樹 階數是人為規定的,結構定下去就已經定的

【5階的B樹】 這裡寫圖片描述

結點的分支個數

  1. 【根結點】≤2
  2. ⌈m/2⌉≤【普通結點】≤m
  3. 【葉子結點】無分支

結點的關鍵字個數

有n個分支的結點(k≤n≤m),有n-1個關鍵字,關鍵字有序排列

  1. 根結點的k=2: 1≤【關鍵字個數】≤m-1
  2. 其他結點的k=⌈m/2⌉:⌈m/2⌉-1≤【關鍵字個數】≤m-1

其他

  1. 結點內關鍵字互不相等
  2. 葉子結點:葉子結點是最下一層,白線的線,可以用空指標表示,是查詢失敗所到達的位置,實際應用中也有可能掛一些記錄
  3. 終端結點:是葉子結點的上一層,也就是關鍵字的最下一層(3,4,22,25…那一層)

高度

兩種說法都可以:

  1. 【3層】不包括葉子結點那一層
  2. 【4層】包括葉子結點那一層

結點個數

計算整棵樹的結點個數:就要把葉子結點也要包括進去 30個

查詢

與二叉排序樹相似

插入

【結點拆分】5階B樹 5階B樹->5個分支->4個關鍵字->結點中的關鍵字只能4個->超過了,結點拆分

  1. 結點的關鍵字≥m 這裡寫圖片描述
  2. 把位置k=⌈m/2⌉的結點提取出來 這裡寫圖片描述
  3. 把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,不滿足條件 –> 但是兄弟結點的個數又少,借不了 –> 合併 這裡寫圖片描述

  1. 先刪除4
  2. 和關鍵字個數較少的兄弟合併,這裡兩個都可以(這裡與右結點合併) 這裡寫圖片描述
  3. 合併之後,父親結點的關鍵字<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指向關鍵字最小的葉子結點,把所有的葉子結點連成一個線性連結串列

其他資料