【B樹操作實例】實例講解插入、刪除元素的過程

基本概念

B樹又稱爲平衡多路查找樹。對於一棵m階的B樹(m代表子樹的最大數量),有如下特性:

  1. 根節點的元素數量至少爲1,至多爲m-1
  2. 非根節點的元素數量至少爲ceil(m/2)-1,至多爲m-1(ceil是向上取整)
  3. 根節點若不是葉節點,則至少有2個子樹
  4. 葉節點都在同一層

以上信息都可以在百度百科和其他博客查到,本文重點以實例講解對B樹進行插入、刪除元素的操作。

 

實例講解

插入和刪除操作可以遵循以下口訣:

插入的操作應該都在葉節點進行,當插入元素後該葉節點沒有過飽和,插入操作結束(實例1);若達到過飽和,就將當前葉節點分裂成兩個節點,把中間元素向上傳遞到父節點(實例2)。

刪除的操作可能在葉節點或非葉節點發生,刪除非葉節點的元素時,將其兩個子樹合併成爲一個節點(實例3);刪除葉節點的元素時,如果沒有剩餘的數量仍大於等於ceil(m/2)-1,刪除操作結束(實例4);如小於,則將父節點對應的元素下移進該節點,此時相當於刪除了父節點(非葉節點)的元素,需要將兩個子樹合併成爲一個節點(實例5);在刪除元素時,合併子樹得到的新節點如果過飽和,需要進行分裂上溢(實例6)。

接下來以5階B樹,舉例說明。

 

實例1

 

向葉節點(7,8)插入元素9之後,葉節點(7,8,9)還沒飽和,插入操作結束。

實例2

向葉節點(22,24,25,28)插入26後,葉節點(22,24,25,26,28)元素數量大於4(即m-1),分裂成(22,24)和(26,28)兩個節點,並把25上溢到(6,10,21,33)得到(6,10,21,25,33),該節點也過飽和了,所以也將分裂成(6,10)和(25,33)兩個節點,並把21上溢成爲兩個節點的父節點。

實例3

從非葉節點(25,33,44)中刪除元素33,變爲(25,44),且將33的左右子樹(26,28)和(38,40)合併成爲一個節點(26,28,38,40),該新節點沒有過飽和,刪除元素過程結束。其實這裏也很好理解,因爲刪除33後該節點只剩2個元樹最多隻能分割3個子樹。

實例4

從葉節點(47,50,53)中刪除元素47,刪除後該節點的元素數量仍大於2(即ceil(5/2)-1),刪除結果結束。

實例5

 從葉節點(22,24)刪除元素24後該節點的元素數量少於2(即ceil(5/2)-1),需要向父節點借一個元素並與相鄰子樹(26,28),本例中向上借到了25,使父節點變成(33,44),並與右邊的相鄰子樹合併成(22,25,26,28),此時自身和父節點都處於平衡狀態。

實例6

 實例6是實例5的拓展。節點(38,40)刪除了元素40以後,該節點向上借到元素44並於右邊的相鄰子樹合併成節點(38,44,47,50,53),此時該節點過飽和,所以把中間元素47交給父節點,自己分裂成兩個節點。

 

總結

在對B樹操作的過程中遵循前面提到的口訣:

如果你遇到的情況不在上面六種實例中,歡迎私信或留言讓我補充~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章