删除根节点后重新平衡 2-3 树的正确方法

Posted

技术标签:

【中文标题】删除根节点后重新平衡 2-3 树的正确方法【英文标题】:Proper way to Re-Balance a 2-3 Tree after deleting the root node 【发布时间】:2016-02-28 14:12:39 【问题描述】:

目标是从根节点中移除 22 并重新平衡树。

首先我删除 22,并用它的有序后继 28 替换它。

其次,我通过将空节点向左移动来重新平衡生成的树。结果树如下。

将 28 向上移动是正确的过程,最后我是否正确平衡了左侧?

         22,34
     /     |    \
   16      28    37
   / \    / \    / \
 15   21 25  33 35 43  

        [28],34
     /     |    \
   16      *     37
   / \    / \    / \
 15   21 25  33 35 43 

           34
        /       \
      16,28      37
    /   |   \    / \
  15  21,25  33 35 43 

谢谢!

【问题讨论】:

一棵2-3棵树的平衡是所有子树的高度相同。在我看来,这里就是这种情况。 22 的顺序后继是 25。 是的,这是一个错误。所以现在我只需要在中间节点组合 (28,33) ,但它们不再处于相同的高度。重新平衡后的左右子树会是什么样子? 【参考方案1】:

删除22

       22,34
   /     |     \
  16     28     37
 / \    / \    / \
15  21 25  33 35  43 ,

我们将其替换为它的有序继任者25,留下一个漏洞 (*)。

       25,34
   /     |     \
  16     28     37
 / \    / \    / \
15  21 *   33 35  43

我们不能通过借用来修复这个洞,所以我们将它的父元素合并到它的兄弟元素中,向上移动这个洞。

       25,34
   /     |     \
  16     *      37
 / \     |     / \
15  21 28,33  35  43

这个洞现在有两个兄弟姐妹,所以我们可以重新分配一个父母的钥匙。

         34
     /        \
  16,25        37
 /  |   \     / \
15  21 28,33 35  43

(我在this set of lecture notes 工作。除非是为了考试,否则不要费心记住这里的细节。即便如此......我真的希望数据结构课程没有像他们那样强调平衡搜索树.)

【讨论】:

必须同意对搜索树评论的强调,但这确实是我学习如何调试代码和递归的地方,这两个非常重要的技能 非常感谢您的解释!

以上是关于删除根节点后重新平衡 2-3 树的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

了解数据结构之平衡二叉树 (AVL)-插入和删除

平衡树的主要算法

红黑树

11-看图理解数据结构与算法系列(B树的删除)

伸展树Splay