資料結構 B樹(B Tree)

2021-10-03 07:33:39 字數 2824 閱讀 8047

b樹是乙個平衡的多路搜尋樹,每個節點可以儲存多個元素。

對於m階b樹(m

>

2m>2

m>

2),設其任意節點儲存元素的個數為x,那麼:

舉些例子:

當m=2時, 非根節點子節點個數:1≤y

≤21\leq y \leq 2

1≤y≤

2,故稱為(1,2)樹,就是二叉搜尋樹。

當m=3時, 非根節點子節點個數:2≤y

≤32\leq y \leq 3

2≤y≤

3,故稱為(2,3)樹。

當m=4時, 非根節點子節點個數:2≤y

≤42\leq y \leq 4

2≤y≤

4,故稱為(2,4)樹。

當m=5時, 非根節點子節點個數:3≤y

≤53\leq y \leq 5

3≤y≤

5,故稱為(2,5)樹。

資料庫的應用中,一般使用200~300階的b樹

同二叉搜尋樹一樣,差不了多少,從根節點比大小,走分支

同樣也是比大小,走分支,最後走到葉子節點,比大小,找到合適的位置插入。需要注意的是,新增只會發生在葉子節點上。

新增只會發生在葉子節點上,如果一直新增元素,當葉子節點元素個數等於m時,就違反了b樹的定義。因為無論是根節點還是非根節點,元素個數的上限都是m−1

m-1m−

1。上溢就是解決此問題的,當元素個數等於m時,選取當前節點中間位置的元素,將其送入父節點,與此同時被選中的元素的左元素們和右元素們都會成為該元素的子節點。

例如乙個5階b樹,如下:

2層有5個元素,大於4個,此時上溢

選取中間元素34送入父節點

此時發現父節點元素個數也超過4了,繼續上溢

選取中間元素40

當刪除的元素為葉子節點上的元素時,直接刪除即可

當刪除的是非葉子節點的元素時,需要找到該元素的前驅或後繼元素,覆蓋掉需要刪除的元素。

例如:

當要刪除的時60時,找55或70覆蓋掉60即可。

由此可以推出,刪除引發的元素減少,只會發生在葉子節點上。

刪除引發的元素減少,只會發生在葉子節點上,如果一直刪除元素,當葉子節點元素個數等於⌈m/

2⌉−2

\lceil m/2\rceil-2

⌈m/2⌉−

2時,就違反了b樹的定義。因為無論是根節點還是非根節點,元素個數的下限都是⌈m/

2⌉−1

\lceil m/2\rceil-1

⌈m/2⌉−

1。下溢就是解決該問題的。當某個節點元素個數等於⌈m/

2⌉−2

\lceil m/2\rceil-2

⌈m/2⌉−

2時,有兩種情況。

相鄰的兄弟節點至少有⌈m/

2⌉\lceil m/2\rceil

⌈m/2

⌉個元素

那麼該節點可以與父節點、兄弟節點的元素進行交換。

舉個例子:

綠色節點元素個數⌈m/

2⌉−2

\lceil m/2\rceil-2

⌈m/2⌉−

2,此時需要借乙個元素。

首先將a送入父節點,父節點的b送入綠色節點,此時綠色節點元素個數⌈m/

2⌉−1

\lceil m/2\rceil-1

⌈m/2⌉−

1。這種操作也叫做旋轉

相鄰的兄弟節點只有⌈m/

2⌉−1

\lceil m/2\rceil-1

⌈m/2⌉−

1個元素

此時就不能用旋轉的方法了,一旦使用旋轉,兄弟節點也將違反約束。

該怎麼辦呢?只需將父節點的元素拿下來與兩個子節點合併即可。

舉個栗子:

將父節點元素b拿下來合併。

合併後的新節點元素個數為⌈m/

2⌉+⌈

m/2⌉

−2\lceil m/2\rceil + \lceil m/2\rceil -2

⌈m/2⌉+

⌈m/2

⌉−2,必然不超過m−1

m-1m−

1,也就是說合併後的新節點不會發生上溢。

b tree資料結構視覺化 資料結構之B 樹

title 資料結構之b 樹 date 2018 11 04 20 39 00 tags 資料結構與演算法之美 一 b 樹索引 1.b 樹的特性 一棵m階b 樹,或者是空樹,或者是滿足以下性質的m叉樹 根結點至少有兩個分支 除根以外的非葉結點,每個結點包含分支數範圍 m 2 m 即關鍵字字數的範圍是...

資料結構 B樹,B 樹

注意b 樹就是b樹,只是乙個符號.簡介b b 樹是為了磁碟或其它儲存裝置而設計的一種平衡多路查詢樹 相對於二叉,b樹每個內節點有多個分支 與紅黑樹相比,在相同的的節點的情況下,一顆b b 樹的高度遠遠小於紅黑樹的高度 在下面b b 樹的效能分析中會提到 b b 樹上操作的時間通常由訪問磁碟的時間和c...

資料結構 B樹 B 樹

b樹 b樹即 balance tree 也就是平衡樹,它是在搜尋樹的基礎上,維持每乙個節點的左右子樹高度之差不超過1的結構,使得搜尋的平均時間複雜度為o log n 級別。二叉搜尋樹 對於任何乙個節點n,其左邊子樹的所有節點值小於n 其右邊子樹的所有節點的值大於n 給點乙個查詢值,從根節點值開始,一...