B 樹以及B 樹

2021-08-29 01:48:50 字數 2902 閱讀 3478

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樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就...