b樹又稱為平衡多路查詢樹。對於一棵m階的b樹(m代表子樹的最大數量),有如下特性:
根節點的元素數量至少為1,至多為m-1
非根節點的元素數量至少為ceil(m/2)-1,至多為m-1(ceil是向上取整)
根節點若不是葉節點,則至少有2個子樹
葉節點都在同一層
插入和刪除操作可以遵循以下口訣:
插入的操作應該都在葉節點進行,當插入元素後該葉節點沒有過飽和,插入操作結束(例項1);若達到過飽和,就將當前葉節點**成兩個節點,把中間元素向上傳遞到父節點(例項2)。
刪除的操作可能在葉節點或非葉節點發生,刪除非葉節點的元素時,將其兩個子樹合併成為乙個節點(例項3);刪除葉節點的元素時,如果沒有剩餘的數量仍大於等於ceil(m/2)-1,刪除操作結束(例項4);如小於,則將父節點對應的元素下移進該節點,此時相當於刪除了父節點(非葉節點)的元素,需要將兩個子樹合併成為乙個節點(例項5);在刪除元素時,合併子樹得到的新節點如果過飽和,需要進行**上溢(例項6)。
接下來以5階b樹,舉例說明。
向葉節點(7,8)插入元素9之後,葉節點(7,8,9)還沒飽和,插入操作結束。
向葉節點(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上溢成為兩個節點的父節點。
從非葉節點(25,33,44)中刪除元素33,變為(25,44),且將33的左右子樹(26,28)和(38,40)合併成為乙個節點(26,28,38,40),該新節點沒有過飽和,刪除元素過程結束。其實這裡也很好理解,因為刪除33後該節點只剩2個元樹最多只能分割3個子樹。
從葉節點(47,50,53)中刪除元素47,刪除後該節點的元素數量仍大於2(即ceil(5/2)-1),刪除結果結束。
從葉節點(22,24)刪除元素24後該節點的元素數量少於2(即ceil(5/2)-1),需要向父節點借乙個元素並與相鄰子樹(26,28),本例中向上借到了25,使父節點變成(33,44),並與右邊的相鄰子樹合併成(22,25,26,28),此時自身和父節點都處於平衡狀態。
例項6是例項5的拓展。節點(38,40)刪除了元素40以後,該節點向上借到元素44並於右邊的相鄰子樹合併成節點(38,44,47,50,53),此時該節點過飽和,所以把中間元素47交給父節點,自己**成兩個節點。
在對b樹操作的過程中遵循前面提到的口訣:
B樹插入刪除操作
b 樹定義 一種平衡的多路查詢樹。用於 索引組織檔案,減少訪問外存次數,節約搜尋時間。一棵m階b 樹或為空樹,或滿足下列特性 為盡量簡單,把考試不考的內容全部略去 1 樹中每個結點至多有m個分支,最少有 m 2 分支,取上整,除根結點外 2.關鍵字數大於等於m 2 1,小於等於m 1,2取上整 3 ...
B樹(又稱B 樹)插入 刪除操作
b樹是一種平衡的多分樹,通常我們說m階的b樹,它必須滿足如下條件 1 每個結點至多有m個子結點 2 除根結點和葉結點外,其它每個結點至少有ceil m 2 個子結點 3 根結點至少有兩個子結點 唯一例外的是根結點就是葉子結點 4 所有的葉結點在同一層 5 有k個子結點的非根結點恰好包含k 1個關鍵碼...
B 樹的插入 刪除操作
include include define maxm 10 b 樹最大階數 typedef int keytype keytype是關鍵字型別 typedef struct node btnode typedef struct b 樹的查詢結果型別 result int m m階b 樹作為全域性變...