1. 程式人生 > >《演算法導論》筆記 第18章 18.3 從B樹中刪除關鍵字

《演算法導論》筆記 第18章 18.3 從B樹中刪除關鍵字

【筆記】

1) 如果關鍵字k在結點x中而且x是個葉結點,則從x中刪除k。

2) 如果關鍵字k在結點x中而且x是個內結點,則作如下操作。

a) 如果結點x中前於k的子結點y包含至少t個關鍵字,則找出k在以y為根的子樹中的前驅k‘。遞迴的刪除k’,並在x中用k'取代k。

b) 對稱的,如果結點x中位於k之後的子結點z包含至少t個關鍵字,則找出k在以z為根的子樹中的後繼k‘。遞迴的刪除k’,並在x中用k‘取代k。

c) 否則,如果y和z都只有t-1個關鍵字,則將k和z中所有關鍵字合併進y,使得x失去k和指向z的指標,這使y包含2t-1個關鍵字。然後,通過對x的某個合適的子結點遞迴而結束。

3) 如果關鍵字k不在結點x中,則確定必包含k的正確地子樹的根c_i[x]。如果c_i[x]只有t-1個關鍵字,執行步驟3a或3b以保證我們降至一個包含至少t個關鍵字的結點。然後,通過對x的某個合適的子結點遞迴而結束。

a) 如果c_i[x]只包含t-1個關鍵字,但它的一個相鄰兄弟包含至少t個關鍵字,則將x中的某一個關鍵字降至c_i[x]中,將c_i[x]的相鄰左兄弟或右兄弟的某一關鍵字升至x,將該兄弟中合適的子女指標移到c_i[x]中,這樣使得c_i[x]增加一個額外的關鍵字。

b) 如果c_i[x]以及c_i[x]的所有相鄰兄弟都包含t-1個關鍵字,則將c_i[x]與一個兄弟合併,即將x的一個關鍵字移至新合併的結點,使之成為該結點的中間關鍵字。

【練習】

18.3-1 請說明按順序從圖中刪除C,P和V後的結果。

18.3-2 請寫出B-TREE-DELETE的虛擬碼。