删除根节点后重新平衡 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 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用