【數據結構】B樹(B Tree)

一、定義

B樹是一個平衡的多路搜索樹,每個節點可以存儲多個元素。

二、性質

對於m階B樹(m>2m>2),設其任意節點存儲元素的個數爲x,那麼:

  • 對於根節點:1xm11 \leq x \leq m-1
  • 對於非根節點:m/21xm1\lceil m/2\rceil - 1 \leq x \leq m-1
  • 如果有子節點,子節點個數爲 y=x+1y = x+1
    • 根節點子節點個數:2ym2 \leq y \leq m
    • 非根節點子節點個數:m/2ym\lceil m/2\rceil \leq y \leq m

舉些例子:

當m=2時, 非根節點子節點個數:1y21\leq y \leq 2,故稱爲(1,2)樹,就是二叉搜索樹。
當m=3時, 非根節點子節點個數:2y32\leq y \leq 3,故稱爲(2,3)樹。
當m=4時, 非根節點子節點個數:2y42\leq y \leq 4,故稱爲(2,4)樹。
當m=5時, 非根節點子節點個數:3y53\leq y \leq 5,故稱爲(2,5)樹。
數據庫的應用中,一般使用200~300階的B樹
在這裏插入圖片描述

三、操作

1.搜索

同二叉搜索樹一樣,差不了多少,從根節點比大小,走分支

2.添加

同樣也是比大小,走分支,最後走到葉子節點,比大小,找到合適的位置插入。需要注意的是,添加只會發生在葉子節點上。

2.1.上溢

添加只會發生在葉子節點上,如果一直添加元素,當葉子節點元素個數等於m時,就違反了B樹的定義。因爲無論是根節點還是非根節點,元素個數的上限都是m1m-1
上溢就是解決此問題的,當元素個數等於m時,選取當前節點中間位置的元素,將其送入父節點,與此同時被選中的元素的左元素們和右元素們都會成爲該元素的子節點。

例如一個5階B樹,如下:
在這裏插入圖片描述
2層有5個元素,大於4個,此時上溢
選取中間元素34送入父節點
在這裏插入圖片描述
此時發現父節點元素個數也超過4了,繼續上溢
選取中間元素40
在這裏插入圖片描述

3.刪除

當刪除的元素爲葉子節點上的元素時,直接刪除即可
當刪除的是非葉子節點的元素時,需要找到該元素的前驅或後繼元素,覆蓋掉需要刪除的元素。

例如:
在這裏插入圖片描述
當要刪除的時60時,找55或70覆蓋掉60即可。
由此可以推出,刪除引發的元素減少,只會發生在葉子節點上。

3.1.下溢

刪除引發的元素減少,只會發生在葉子節點上,如果一直刪除元素,當葉子節點元素個數等於m/22\lceil m/2\rceil-2時,就違反了B樹的定義。因爲無論是根節點還是非根節點,元素個數的下限都是m/21\lceil m/2\rceil-1
下溢就是解決該問題的。當某個節點元素個數等於m/22\lceil m/2\rceil-2時,有兩種情況。

  1. 相鄰的兄弟節點至少有m/2\lceil m/2\rceil個元素
    那麼該節點可以與父節點、兄弟節點的元素進行交換。
    舉個例子:
    在這裏插入圖片描述
    綠色節點元素個數m/22\lceil m/2\rceil-2,此時需要借一個元素。
    在這裏插入圖片描述
    首先將a送入父節點,父節點的b送入綠色節點,此時綠色節點元素個數m/21\lceil m/2\rceil-1。這種操作也叫做旋轉
  2. 相鄰的兄弟節點只有m/21\lceil m/2\rceil-1個元素
    此時就不能用旋轉的方法了,一旦使用旋轉,兄弟節點也將違反約束。
    該怎麼辦呢?只需將父節點的元素拿下來與兩個子節點合併即可。
    舉個栗子:
    在這裏插入圖片描述
    將父節點元素b拿下來合併。
    在這裏插入圖片描述
    合併後的新節點元素個數爲m/2+m/22\lceil m/2\rceil + \lceil m/2\rceil -2,必然不超過m1m-1,也就是說合並後的新節點不會發生上溢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章