【问题标题】:Is Red-Black tree balanced红黑树是否平衡
【发布时间】:2015-04-16 08:25:32
【问题描述】:

我正在研究红黑树,并且正在阅读 Cormen 的“算法简介”一书。现在我正在尝试通过使用书中描述的伪代码 - RB-INSERT-FIXUP(T, z) 来创建编号为 1-10 的红黑树。这是屏幕截图

在我将数字“6”插入树之前,一切都很好。根据伪代码我得到以下结果

正如您所见,所有红黑树要求都已满足,但我很困惑,因为我知道红黑树应该在每个步骤上保持平衡。

我可以用“2”和“4”手动执行“左旋转”程序并更改颜色。在那种情况下,我会得到以下结果,这是适当平衡的

所以我的问题是:

树不平衡可以吗?还是我在插入节点时遗漏了什么?

【问题讨论】:

  • 我认为 rb 树的不平衡深度可达 2 log n。你应该检查一下。一棵完美平衡的树的深度大约为 log n。 rb 树中的不平衡性还不足以破坏它对于各种操作的大 O。

标签: algorithm tree binary-tree red-black-tree


【解决方案1】:

它们不平衡,因为它们不满足平衡树属性:

如果对于每个节点,二叉树的左子树中的内部节点数和右子树中的内部节点数最多相差 1,则二叉树是平衡的。

有些书称其为“近似平衡”,因为保证了对数时间的添加/删除/搜索操作。 (平衡树是 AVL 树。)

【讨论】:

    【解决方案2】:

    这很好。红黑树是平衡的,但不一定完美。准确地说,红黑树的属性保证到叶子的最长路径(隐式,未在您的图片中显示)最多是最短路径的两倍。最短的长度为 2(2 -> 1 -> 叶),最长的长度为 4(2 -> 4 -> 5 -> 6 -> 叶),所以不变量成立。

    【讨论】:

    • 感谢您的回答。我只是想如果可能的话,为什么我们不总是平衡树(就像我提到的情况一样)。然后我认为它会影响复杂性。
    • 是的,rb-tres 似乎在...平衡和速度之间取得了很好的平衡 :) 还有其他平衡方案 - 例如AVL 树保证更平衡的树具有相同的复杂性,但常数更差。在实践中似乎用得不多。
    • @MarcinŁoś 你能看看我的 RedBlackTree 删除方法吗? *.com/questions/28705454/…
    • @AshotKhachatryan,你应该看看 2-3-4 树,一种高度完全平衡的树。 2-3-4树和红黑树的关系非常密切,但一般来说2-3-4树的平衡不变量更容易表达,红黑树的操作也更容易实现。