一、定義
B樹是一個平衡的多路搜索樹,每個節點可以存儲多個元素。
二、性質
對於m階B樹(),設其任意節點存儲元素的個數爲x,那麼:
- 對於根節點:
- 對於非根節點:
- 如果有子節點,子節點個數爲
- 根節點子節點個數:
- 非根節點子節點個數:
舉些例子:
當m=2時, 非根節點子節點個數:,故稱爲(1,2)樹,就是二叉搜索樹。
當m=3時, 非根節點子節點個數:,故稱爲(2,3)樹。
當m=4時, 非根節點子節點個數:,故稱爲(2,4)樹。
當m=5時, 非根節點子節點個數:,故稱爲(2,5)樹。
數據庫的應用中,一般使用200~300階的B樹
三、操作
1.搜索
同二叉搜索樹一樣,差不了多少,從根節點比大小,走分支
2.添加
同樣也是比大小,走分支,最後走到葉子節點,比大小,找到合適的位置插入。需要注意的是,添加只會發生在葉子節點上。
2.1.上溢
添加只會發生在葉子節點上,如果一直添加元素,當葉子節點元素個數等於m時,就違反了B樹的定義。因爲無論是根節點還是非根節點,元素個數的上限都是。
上溢就是解決此問題的,當元素個數等於m時,選取當前節點中間位置的元素,將其送入父節點,與此同時被選中的元素的左元素們和右元素們都會成爲該元素的子節點。
例如一個5階B樹,如下:
2層有5個元素,大於4個,此時上溢
選取中間元素34送入父節點
此時發現父節點元素個數也超過4了,繼續上溢
選取中間元素40
3.刪除
當刪除的元素爲葉子節點上的元素時,直接刪除即可
當刪除的是非葉子節點的元素時,需要找到該元素的前驅或後繼元素,覆蓋掉需要刪除的元素。
例如:
當要刪除的時60時,找55或70覆蓋掉60即可。
由此可以推出,刪除引發的元素減少,只會發生在葉子節點上。
3.1.下溢
刪除引發的元素減少,只會發生在葉子節點上,如果一直刪除元素,當葉子節點元素個數等於時,就違反了B樹的定義。因爲無論是根節點還是非根節點,元素個數的下限都是。
下溢就是解決該問題的。當某個節點元素個數等於時,有兩種情況。
- 相鄰的兄弟節點至少有個元素
那麼該節點可以與父節點、兄弟節點的元素進行交換。
舉個例子:
綠色節點元素個數,此時需要借一個元素。
首先將a送入父節點,父節點的b送入綠色節點,此時綠色節點元素個數。這種操作也叫做旋轉。 - 相鄰的兄弟節點只有個元素
此時就不能用旋轉的方法了,一旦使用旋轉,兄弟節點也將違反約束。
該怎麼辦呢?只需將父節點的元素拿下來與兩個子節點合併即可。
舉個栗子:
將父節點元素b拿下來合併。
合併後的新節點元素個數爲,必然不超過,也就是說合並後的新節點不會發生上溢。