B樹(B-樹)

1.基本概念:html

 M定義爲樹的高度,也叫階,就是樹的深度;算法

 (1).B樹又稱爲多路平衡查找樹。指針

 (2).根節點至少有兩個子節點。htm

 (3).除根節點之外的非葉子節點的兒子樹爲[M/2,M]。blog

 (4).每一個節點存放至少M/2 - 1 (向上取整) 和 至多 M-1個關鍵字。排序

 (5).非葉子節點的關鍵字個數 = 指向兒子的指針個數 - 1。方法

 (6).非葉子節點的關鍵字: K[1], K[2],...,K[M-1]; 且 K[i] < K[i + 1]。im

 (7).非葉子節點的指針 : P[1],P[2],....P[M],其中P[1]指向關鍵字小於K[1]數據

P[M]指向關鍵字及其子樹的值大於K[M-1]的值 。db

 (8).全部葉子節點位於同一層。

2.B-樹的查找:

  B-樹的查找過程:根據給定值查找節點和在節點的關鍵字中進行查找交叉進行。首先從根節點開始重複以下過程:

若比節點的第一個關鍵字小,則查找在該節點第一個指針指向的節點進行,若等於節點中某個關鍵字,則查找成功;若在兩個關鍵字之間,則查找在他們之間的指針指向的節點進行;若比該節點全部的關鍵字打,則查找在該節點最後一個指針指向的節點進行;若查找已經到達某個葉子節點,則說明給定值對應的數據記錄不存在,查找失敗。

3.B-樹的插入:

  插入的過程分兩步完成;

(1)利用前面的B-樹的查找算法查找關鍵字的插入位置,若找到,則說明該關鍵字已經存在,直接返回。

(2)判斷該節點是否還有空位置,即判斷該節點的關鍵字總數是否小於M-1。若知足,則說明該節點還有空位置,直接把關鍵字K插入到該節點的合適位置上,若不知足,說明該節點已經沒有空位置,須要把節點分紅兩個。

 分裂的方法是:生成一個新節點。把原來節點上的關鍵字和K按照升序排序後,從中間位置把關鍵字分紅兩部分。左部分所含關鍵字放在舊節點中,右部分所含關鍵字放在新節點中,中間位置的關鍵字連同新節點的存儲位置插入到父節點中。若是父節點的關鍵字個數也超過M-1則要再進行分裂,再往上插。直至這個過程傳到根節點爲止。

 

 

4.B_樹的刪除

 在B-樹上刪除關鍵字K的過程分兩步完成:

(1)利用前面的B-樹的查找算法找出改關鍵字所在的節點。而後根據K所在節點是否爲葉子節點有不一樣的處理方法;

(2)若該節點爲非葉子節點,且被刪除關鍵字爲該節點中的第i個關鍵字key[i],則可從指針son[i]所指的子樹中找出最小關鍵字Y,代替key[i]的位置,而後再葉子節點中刪除Y。

 所以,把在非葉子節點刪除關鍵字K的問題就變成了刪除葉子節點中的關鍵字問題了。

 

在B-樹葉子節點上刪除一個關鍵字的方法是

  首先將要刪除的關鍵字K直接從該葉子節點中刪除。而後根據不一樣狀況分別做相應的處理,共有三種可能狀況:

(1)若是被刪除關鍵字所在節點的原關鍵字個數n>=ceil(m/2),說明刪除該關鍵字後該節點仍然知足B-樹的蒂尼。這種狀況最簡單。

(2)若是被刪除關鍵字所在節點的關鍵字個數n等於ceil(m/2) -1,說明刪除該關鍵字後該節點不知足B-樹的定義,須要調整。

  調整的過程:若是其左右兄弟節點中右「多餘」的關鍵字,即與該節點相鄰的右(左)兄弟節點中的關鍵字數目大於ceil(m/2)-1。則可將右(左)兄弟節點中最小(大)關鍵字上移至雙親節點。而將雙親節點中小(大)於該上移關鍵字的關鍵字下移至被刪關鍵字所在節點中。

(3)若是左右兄弟節點中沒有「多餘」的關鍵字,即與該節點相鄰的右(左)兄弟節點中的關鍵字數目均等於ceil(m/2) - 1。這種狀況比較複雜,須要把要刪除關鍵字的節點與其左(或右)兄弟節點以及雙親節點中分割兩者的關鍵字合併成一個節點,即在刪除關鍵字後,該節點中剩餘的關鍵字加指針,加上雙親節點中的關鍵字Ki一塊兒,合併到Ai(是雙親節點指向該刪除關鍵字節點的左(右)兄弟節點的指針)所指的兄弟節點中去。若是所以使雙親節點中關鍵字個數小於ceil(m/2) -1,則對此雙親節點作一樣處理。以至於可能直到對根節點作這樣的處理而使整個樹減小一層。

 

總之,設所刪關鍵字爲非葉子節點中的Ki,則能夠指針Ai所指子樹中的最小關鍵字Y代替Ki,而後再相應節點中刪除Y。對任意關鍵字的刪除均可以轉換爲對最下層關鍵字的刪除。

 

 

參考文獻:http://www.cnblogs.com/oldhorse/archive/2009/11/16/1604009.html

     https://wenku.baidu.com/view/387c4d6c5727a5e9856a6186.html

相關文章
相關標籤/搜索