B树:删除非叶节点?

时间:2016-07-05 15:04:11

标签: data-structures tree b-tree

我正在研究B树,在书中他们说:

  1. 如果密钥k在节点x中且x是叶子,则从x中删除密钥k。

  2. 如果密钥k在节点x中且x是内部节点,请执行以下操作。

  3. 一个。如果节点x中位于k之前的子y具有至少t个密钥,则在以y为根的子树中找到k的前驱k'。递归删除k',并用x替换k'。 (找到k'并删除它可以在一次向下传递中执行。)

    湾对称地,如果在节点x中跟随k的子z具有至少t个密钥,则在以z为根的子树中找到k的后继k'。递归删除k',并用x替换k'。 (找到k'并删除它可以在一次向下传递中执行。)

    ℃。否则,如果y和z都只有t-1个键,则将k和z的所有z合并为y,这样x会丢失k和指向z的指针,而y现在包含2t - 1个键。然后,释放z并递归地从y中删除k。

    我的问题是:如果是2.a. 有人可以用例子解释我:递归删除k',并用x中的k'替换k。

    问候。

1 个答案:

答案 0 :(得分:1)

假设您有b树,其度数为t = 4:

   26,      49,      60
27,31,34,36     51,55,56,58

假设y = [27,31,34,36]x = [51,55,56,58]不是叶节点,而您想删除密钥k = 51。让K = 49成为分割xy的父节点中的密钥。

找到k的前身,它是子树k'中最右边的键y(在此示例中可能包含37到48之间的整数,比如k' = 40) 。设置k = K = 49K = k' = 40并递归删除k'(这实际上是节点为leaf时删除过程的第一种情况)。生成的b树看起来像

   26,      40,      60
27,31,34,36     49,55,56,58