Programming is an art form.
一、定義
B樹是一種平衡的多分樹,通常我們說m階的B樹,它必須滿足如下條件:
(1)每個結點至多有m個子結點;
(2)除根結點和葉結點外,其它每個結點至少有ceil(m/2)
個子結點;
(3)根結點至少有兩個子結點;(唯一例外的是根結點就是葉子結點)
(4)所有的葉結點在同一層;
(5)有k個子結點的非根結點恰好包含k-1個關鍵碼,關鍵碼按照遞增次序進行排列。
ceil代表向上取整
二、查詢
B-樹的查詢很簡單,是二叉排序樹的擴充套件,二叉排序樹是二路查詢,B-樹是多路查詢,因為B-樹結點內的關鍵字是有序的,在結點內進行查詢時除了順序查詢外,還可以用折半查詢來提升效率。B-樹的具體查詢步驟如下(假設查詢的關鍵字為key):
(1)先讓key與根結點中的關鍵字比較,如果key等於k[i](k[]為結點內的關鍵字陣列),則查詢成功;
三、插入
以一個3階的B樹為例:
(1)如果該結點的關鍵字個數沒有到達2個,那麼直接插入即可;
(2)如果該結點的關鍵字個數已經到達了2個,那麼根據B樹的性質顯然無法滿足,需要將其進行分裂
分裂的規則是該結點分成兩半,將中間的關鍵字進行提升,加入到父親結點中,但是這又可能存在父親結點也滿員的情況,則不得不向上進行回溯,甚至是要對根結點進行分裂,那麼整棵樹都加了一層。
例1——————————————
例2——————————————-
四、刪除
首先需要明確一點:刪除非葉子結點必然會導致不滿足B樹性質
那麼可以這樣處理:被刪關鍵字為該結點中第i個關鍵字key[i],則可從指標son[i]所指的子樹中找出最小關鍵字Y,代替key[i]的位置,然後在葉結點中刪去Y。 因此,把在非葉結點刪除關鍵字k的問題就變成了刪除葉子結點中的關鍵字的問題了,
那麼B樹的刪除操作就變成了刪除葉子結點中的關鍵字問題了。
(1)被刪關鍵字Ki所在結點的關鍵字數目不小於ceil(m/2),則只需從結點中刪除Ki和相應指標Ai,樹的其它部分不變
(2)被刪關鍵字Ki所在結點的關鍵字數目等於ceil(m/2)-1,則需調整。
(3)被刪關鍵字Ki所在結點和其相鄰兄弟結點中的的關鍵字數目均等於ceil(m/2)-1,假設該結點有右兄弟,且其右兄弟結點地址由其雙親結點指標Ai所指。則在刪除關鍵字之後,它所在結點的剩餘關鍵字和指標,加上雙親結點中的關鍵字Ki一起,合併到Ai所指兄弟結點中(若無右兄弟,則合併到左兄弟結點中)。如果因此使雙親結點中的關鍵字數目少於ceil(m/2)-1,則依次類推。