1. 程式人生 > >2、B-樹的插入和生成

2、B-樹的插入和生成

B-樹的生成是從空樹起,逐個插入關鍵字而得到的。

(1)插入關鍵字K的方法
     首先在樹中查詢K,若找到則直接返回(假設不處理相同關鍵字的插入);否則查詢操作必失敗於某個葉子上,然後將K插入該葉子中。若該葉子結點原來是非滿(指keynum<Max,即結點中原有的關鍵字總數小於m-1)的,則插入K後並未破壞B-樹的性質,故插入K後即完成了插入操作;若該結點原為滿,則K插入後keynum=m,違反B-樹性質(3),故須調整使其維持B-樹性質不變。
調整操作:
     將違反性質(3)的結點以中間位置上的關鍵字 為劃分點,將該

結點(不妨設是*current):
         (m,P0,K1,P1

,…,Km,Pm) //Ki表示key[i],Pi表示son[i]
"分裂"為兩個結點:
   
  
並將中間關鍵字 (和新結點指標new一起插入到*current的雙親*parent中。
注意:
     ①當m為奇數時,分裂後的兩結點中的關鍵字數目相同,均是半滿;
     ②若m為偶數,則*new中關鍵字數比*current中關鍵字數多1。 

   其中i表示key和son向量的下標。
  注意:
     當和新結點的地址一起插入已滿的雙親後,雙親也要做分裂操作。最壞情況是,從被插入的葉子到根的路徑上各結點均是滿結點,此時,插入過程中的分裂操作一直向上傳播到根。當根分裂時,因根沒有雙親,故需建立一個新的根,此時樹長高一層。

(2)B-樹的生成


     由空樹開始,逐個插入關鍵字,即可生成B-樹。
【例】以關鍵字序列(a,g,f,b,k,d,h,m,i,e, s,i,r,x,c,l,n,t,u,p)建立一棵5階B-樹的生長過程【參見動畫演示
注意:
     ①當一結點分裂時所產生的兩個結點大約是半滿的,這就為後續的插入騰出了較多的空間,尤其是當m較大時,往這些半滿的空間中插入新的關鍵字不會很快引起新的分裂。
  ②向上插人的關鍵字總是分裂結點的中間位置上的關鍵字,它未必是正待插入該分裂結點的關鍵字。因此,無論按何次序插入關鍵字序列,樹都是平衡的。