這篇部落格主要講解b樹及其插入刪除操作,並給出操作的流程圖以達到清晰易懂的目的,儘管標題是從二叉排序樹到平衡二叉樹再到紅黑樹系列3,沒有b樹二字,但他們都是動態查詢樹,所以我將他們歸為乙個系列。
b樹的定義有如下兩種,但殊途同歸。
定義形式一(以度 t 定義):
一棵b樹t 具有以下性質:
1.每個結點x有下面屬性
a x.n當前儲存在結點x中的關鍵字個數。
b x.n個關鍵字本身,且按非遞減順序排列
c x.leaf 布林值 如果x是葉子結點,則為true,否則為false
2.每個內部結點x還包含x.n+1個指向其孩子的指標。(x.n個關鍵字將乙個區間分為x.n+1個子區間,所以有x.n+1個孩子,孩子數=關鍵字數+1)。葉結點沒有孩子,所以它們的沒有指向孩子的指標。
3.x.n個關鍵字對儲存在各子樹中的關鍵字範圍進行分割。
4 每個葉節點具有相同的深度。即樹的高度h
5 每個結點包含的關鍵字的個數稱為度,最小度數t>=2;
a 根結點至少有乙個關鍵字,除了根節點,其他每個結點必須至少(t-1)個關鍵字
b 每個結點至多包含(2t-1)個關鍵字,即乙個內部結點最多可以有2t個孩子,當乙個結點恰好有2t-1個關鍵字時,稱該結點是full的。
struct bnode
例如 t=2 的b樹最簡單,每個內部結點可以有2,3,4個孩子,即為一棵2-3-4樹。下面給出 t = 2 表示的所有合法的b樹。
根結點關鍵字個數最少為1個,最多為3個(顯然根有3個關鍵字,則其要有4個孩子,至少4個關鍵字,一共7個關鍵字》5) 其餘結點至少1個關鍵字,至多3個關鍵字。
一棵包含n個關鍵字,高度為h 最小度數 t >=2的b數 有如下性質:
《注意:樹高h是從1開始算起,即只有根節點的b樹高度h=1,與演算法導論略有不同》
可以得到:對於一共含有n個關鍵字 度為 t 的 b樹,其高度上限為log(t)((n+1)/2)+1 ,可見 b樹是乙個非常有效率的資料結構。
下面給出b樹定義形式二(按階定義):
一棵 m 階的b樹滿足以下條件:
1 每個結點至多有m棵子樹 <==該結點至多m-1個關鍵字》
2 除根結點,其他分支結點至少有[m/2](取上界)棵子樹 <==至少[m/2]-1個關鍵字》
3 根結點至少有2棵子樹
4 所有葉子結點在同一層,葉子結點不含任何關鍵字資訊
5 有 j 個孩子的非葉子結點恰好有j-1個關鍵字
事實上,按度定義是從b樹結點的關鍵字個數出發 按階定義是按b樹結點的子樹個數出發,都是一樣的。
下面主要介紹b樹的插入和刪除操作:
b樹關鍵字的插入:首先要考慮的是待插入關鍵字是否存在,若不存在,在查詢的過程中就會找到插入結點的位置。插入時主要要考慮的待插入結點是否有足夠的空間將關鍵字插入進去(插入後還要移動元素以保證公升序有序)。如果結點空間已滿,這時就要**結點。並將**前結點的中間關鍵字去除上移給雙親結點。如果雙親結點已滿,則需要再度**。 最壞的情況是 插入乙個關鍵字,卻需要一直**到根結點,再新增乙個結點,整個b樹增加了一層,高度h=h+1;
具體流程圖如下:
b樹關鍵字的刪除:在刪除乙個關鍵字時,首先要找到關鍵字的位置,並考慮刪除後該結點關鍵字的大小是否滿足b樹的要求 和 對關鍵字左右子樹的影響。流程圖中非刪除關鍵字所在結點是否為葉子結點分類討論。必要時,要合併子樹。最極端的一種情況,因為刪除乙個關鍵字,從下往上合併結點,最後導致b樹的高度h=h-1.
具體流程圖如下:
關於b樹插入刪除關鍵字的幾點補充說明:
1 關鍵字的插入 一定是在葉子結點,所以不需要考慮對子樹影響,只需要考慮結點可能超過容量,因而要**結點。而刪除可能發生在非葉子結點,所以要考慮對子樹影響,且結點刪除乙個關鍵字,可能小於關鍵字數量下限,因而要合併結點。
2 **結點時,父結點的子樹多了乙個,因而父結點的關鍵字也要多乙個,將待**結點中間值上移給父結點,正好劃分為兩部分且結點容量滿足數量要求。
3 刪除關鍵字時,結點關鍵字個數達到下限,並不急著合併結點,而是先間接向關鍵字數量較多(較多:借了之後不會導致到達關鍵字下限)的相鄰兄弟結點借關鍵字(實際過程為向父結點借乙個,父結點的缺失由相鄰兄弟結點上移乙個關鍵字補充,此為間接之含義,為什麼不直接向兄弟結點借關鍵字,是因為保證關鍵字有序,兄弟結點如果是右邊兄弟關鍵字大於父節點關鍵字的)。只有當相鄰結點關鍵值數量都為下限,不能外借時,才會考慮合併。
4 合併結點時,父結點的子樹少了乙個,因而父結點的關鍵字也要少乙個;因而父節點的乙個關鍵字下移到合併結點中。此時合併結點的關鍵字數量為(t-1)+1+(t-2)=2t-2
剛好小於每個結點關鍵字數量上限 (2t-1)。 父節點下移乙個關鍵字後是不是達到下限,如果是,又要重複上述操作(此時,相當於父節點刪除了乙個元素),回到說明3.
5 插入時達到上限的**是必然的,而刪除時達到下限的合併不是首先要考慮的,盡量外借關鍵字以維持b樹結構。
b+樹
儘管b樹的查詢效率很高,但是並沒有解決元素遍歷的效率低下問題,為了解決這個問題,出現了b+樹,b+樹只需要遍歷葉子結點就可以實現整棵樹的遍歷,特別適合資料庫中基於範圍的查詢。另外對於b+樹,所有關鍵字資訊都儲存在葉子結點,所以關鍵字查詢的路徑長度相同,比較穩定。
b+樹是應檔案系統所需而出現的一種b樹的變形樹。一棵m階的b+樹和m階的b樹的區別是:
1 有n棵子樹的結點中含有n個關鍵字
2 所有葉子結點中包含了全部的關鍵字資訊,以及指向這些關鍵字記錄的指標,且葉子結點本身以關鍵字大小公升序排序連線
3 所有非葉子結點可以看為索引部分,結點中僅含有其子樹中的最大(或最小)關鍵字。
二叉排序樹 平衡二叉樹 紅黑樹概念
二叉排序樹 1 如果它左子樹非空,則左子樹上所有元素的值均小於根元素的值 2 如果它右子樹非空,則右子樹上所有元素的值均大於根元素的值 3 左,右子樹本身又各是一棵二叉排序樹 平衡二叉樹 一棵二叉樹中每個結點的左 右子樹的高度至多相差1,則此二叉樹為平衡二叉樹 平衡因子 左子樹高度 右子樹高度 1 ...
二叉樹,完全二叉樹,滿二叉樹,二叉排序樹
二叉樹 二叉樹是每個節點最多有兩個子樹的樹結構 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。完全二叉樹 除最後一層外,每一層上的結點數均達到最大值 在最後一層上只缺少右邊的若干結點 樹中所含的n個節點和滿二叉樹中編號...
二叉查詢樹 平衡二叉樹 紅黑樹
先看幾個基本概念 樹 由根出發,指向n個孩子,孩子再指向孫子。這樣一種資料結構 二叉樹 每個接點最多有兩個孩子的樹 二叉查詢樹 每個結點的左子樹 結點 右子樹 平衡二叉樹 每個結點左右子樹的高度差不大於1 紅黑樹 從任一節點到其每個葉子的所有簡單路徑 都包含相同數目的黑色節點。當然還有其它性質 幾點...