/* ========================================================================
DeleteInternal( x, rx, N ):
(rx = the right tree pointer of x)
Delete (searchKey x, x's rightTreePtr rx) from an internal node N
in the B+-tree where minKey < x ≤ maxKey
======================================================================== */
DeleteInternal( x, rx, N )
{
Delete x, rx from node N; // Deletion done... but node may underflow !!!
/* ====================================
Check for underflow condition...
==================================== */
if ( N has ≥ ⌈(n+1)/2⌉ pointers /* At least half full*/ )
{
return; // Done
}
else
{
/* ---------------------------------------------------------
N underflowed: fix the size of N with transfer or merge
--------------------------------------------------------- */
/* ========================================================
Always try transfer first !!!
(Merge is only possible if 2 nodes are half filled)
======================================================== */
if ( leftSibling(N) has ≥ ⌈(n+1)/2⌉ + 1 pointers )
{
1. transfer right subtree link into N as the first link
2. transfer last key from leftSibling(N) through parent into N as the first key;
(The transfer operation in an internal node is similar to tree rotation in BST)
}
else if ( rightSibling(N) has ≥ ⌈(n+1)/2⌉ + 1 pointers )
{
1. transfer left subtree link into N as the last link
2. transfer first key from rightSibling(N) through parent into N as the last key;
(The transfer operation in an internal node is similar to tree rotation in BST)
}
/* ===============================================================
Here: we cannot solve underflow with a transfer
Because: BOTH sibling nodes have minimum # keys/pointers
(= half filled !!!)
Solution: merge the underflowed node with one of its sibling
=============================================================== */
else if ( leftSibling(N) exists )
{
/* ===============================================
merge underflow node N with left sibling node
=============================================== */
1. Merge (1) leftSibling(N) + (2) key in parent node + (3) underflow node N
into the leftSibling(N) node;
2. DeleteInternal ( transfered key, right subtree ptr, parent(N) ); // Recurse !!
}
else // Node N must have a right sibling node !!!
{
/* ===============================================
merge underflow node N with right sibling node
=============================================== */
1. Merge (1) underflow node N + (2) key in parent node + (3) rightSibling(N)
into the node N;
2. DeleteInternal ( transfered key, right subtree ptr, parent(N) ); // Recurse !!
}
}
|