b樹是一種平衡的多路查詢樹,包括b-樹以及b+樹。乙個節點可以擁有多個key以及多個孩子節點。一棵d+1階(又稱為branch factor)的b樹滿足如下條件:
b-樹的每個節點均儲存key以及相應的value。b-樹還具有如下特點:
b-樹中的旋轉操作不同於自平衡二叉搜尋樹,並不改變樹的結構,僅僅更改key的位置。
**左旋:**將父節點中的key,替換對應子節點中預刪除key,而將右兄弟節點中最小的key替換父節點中的key。例如上圖中,刪除76,那麼父節點78替換76的位置,右兄弟中最小的79替換78的位置。
**右旋:**將父節點中的key,替換對應子節點中預刪除key,而將左兄弟節點中最大的key替換父節點中的key。
旋轉操作後,節點內的key需要重新排序。
合併操作發生在預刪除key所在節點以及左右兄弟包含的key的個數均等於d。那麼刪除乙個key後,無法從左右兄弟中通過旋轉操作補充key,只能與兄弟以及父節點中的分離點key合併,同時更新孩子節點的父節點。合併後的節點含有2*d個key。繼續向上調整key的位置。
例如上圖中,刪除7,那麼需要與右兄弟[20,25]合併,同時將父節點中的12拉回來,繼續向上更新,則需要合併[13],[54]以及[69, 78]。
b-樹從根節點開始,若節點中存在相同key,即break。
從根節點開始查詢方法:
找到節點
b-樹是自底向上生長的。
搜尋到最底層節點,將key插入到節點中
若當前節點包含key的個數大於m-1,則劈裂派生出新節點,中位數插入當前節點的父節點。繼續向上更新
若根節點包含key個數大於2*d,則構建新的根節點
刪除最底層節點m中的key:
m中key的個數大於d,則直接刪除,break
key的個數小於等於d,則:
若左右兄弟節點中存在key的個數大於d,則rotate,break
若左右兄弟節點key的個數均小於d,則merge,繼續向上更新
刪除非最底層節點中的key,用以該key為分離點的右邊孩子節點中最小的key替換,直到最低層節點轉上1(例如預刪除78,實際刪除79)
b+樹與b-樹結構類似,對樹的操作同樣涉及旋轉、合併等,主要區別如下:
**左旋:**右兄弟中最小key替換預刪除key,重新排序後逐步向上更新父節點中key。
**右旋:**左兄弟中最大key替換預刪除key,重新排序後逐步向上更新父節點中key。
與b-樹類似,合併兄弟節點的key以及孩子節點。繼續向上更新節點的key,若合併葉節點還需要更新指標。
**順序搜尋:**從head指標開始順序搜尋葉節點。
**隨機搜尋:**與b-樹類似,不同是每次搜尋必須到葉節點才返回(因為只有葉節點儲存了value)。
與b-樹類似,需要注意的是如果插入的key是所在節點最大的key,那麼就需要向上更新key。
與b-樹類似,需要注意的是,自底向上合併時,如果當前節點的父節點只有乙個key,那麼該父節點就是根節點,沒有存在的必要,應以當前節點為新的根節點。
# b+樹刪除操作部分示例**
defupdatedelete
(self, currentnode)
: p = currentnode.parent
ind = p.children.index(currentnode)
# 獲取當前節點在兄弟節點中的位置
if ind ==0:
# 第乙個,則無左兄弟
sr = p.children[ind +1]
iflen
(sr.keys)
> self.d:
# 右兄弟key個數大於d,則左旋
self.leftrotate(currentnode, ind, p, sr)
else
: self.rightmerge(currentnode, ind, p, sr)
iflen
(p.keys)
>1:
self.updatedelete(p)
else
:# 表明父節點為根節點,且只有乙個key,那麼孩子節點公升級為根節點
self.root = p.children[0]
elif ind ==
len(p.children)-1
:# 最後乙個,則無右兄弟
sl = p.children[ind -1]
iflen
(sl.keys)
> self.d:
self.rightrotate(currentnode, ind, p, sl)
else
: self.leftmerge(currentnode, ind, p, sl)
iflen
(p.keys)
>1:
self.updatedelete(p)
else
: self.root = p.children[0]
else
: sl = p.children[ind -1]
sr = p.children[ind +1]
iflen
(sl.keys)
> self.d:
self.rightrotate(currentnode, ind, p, sl)
elif
len(sr.keys)
> self.d:
self.leftrotate(currentnode, ind, p, sr)
else
: self.leftmerge(currentnode, ind, p, sl)
完整**請參看我的github
注:本文是個人的一些思考,**等若有不當之處,還請指正。
B 樹以及B 樹和B 樹
b樹說白了就是乙個結點有多個子結點。本文介紹的資料結構英文是b tree,中文寫作b 樹,其中 並不是減號,而是連線符,讀作b樹。b 樹是一種平衡搜尋樹,但它的每個結點包含的元素可以多於2個,因此並不是嚴格意義上的二叉樹。相比與二叉樹,b樹顯得更矮,更胖。它的每個結點包含多個資料,這特別適合於對外存...
B樹,B 樹,B 樹,B 樹
小彰的部落格 b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點...
B樹 B 樹 B 樹 B 樹
b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就...