algorithm - 在红黑树中旋转后重新着色时要遵循的规则

标签 algorithm rotation red-black-tree

我只是 RB 树的新手。我只是在旋转后为树重新着色而被绞死。

让我们考虑以下情况:-

插入顺序:34,32,56,30,31

            34 (B)

        32 (B)      56 (B)

    30 (R)

        31 (R)

在上面的例子中,31插入到30的父级时发生颜色冲突,并且高度不稳定。

所以对于树 32、30、31,我们进行左右旋转,这与在 AVL 树中所做的相同。

直到这次轮换,我觉得还好。

但是旋转之后,树会变成这样,

            34 (B)

        31 (R)      56 (B)

    30 (R)      32 (B)

所以在这里,红-红冲突发生在 31 和 30。左子树的黑色也受到影响。

请问,我必须应用哪些公式/条件步骤来纠正这个着色和黑度问题。

提前致谢。

最佳答案

我已经教授算法和数据结构几年了,我对红/黑树的诚实建议如下:

Know where the rotation rules and color flips come from, but don't memorize them.

实际需要手动跟踪红/黑树旋转或必须对其进行编码的情况极为罕见。在这些情况下,我建议做大多数人所做的事情,即打开 CLRS 的副本。并复制它们包含的任何伪代码。

在我看来,更有值(value)的是首先了解这些规则的来源以及人们如何设法推导出这些规则。虽然这并不经常被教导,但红/黑树的原始规则是通过使用红/黑树与称为 2-3-4 tree 的相关数据结构之间的连接而得出的。 . 2-3-4 树比红/黑树更容易理解,一旦你看到它们之间的联系,你实际上可以重新推导所有旋转和颜色翻转,你需要修复红/黑树-the-the-fly,没有太多困难。我已经放在一起了a set of lecture slides outlining the connection between these data structures and how to use it ,如果您有兴趣,这可能是了解红/黑树工作原理的好方法。

关于algorithm - 在红黑树中旋转后重新着色时要遵循的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37948027/

相关文章:

algorithm - 拆分具有约束的子集

计算 K 逆对数时 C++ 溢出

Javascript 更改外部 css 表中的关键帧值(无内联样式更改!)

java - "p[z] <-- y"伪代码在java中的解释是什么?

Java 在 O(N) 中迭代 TreeMap/TreeSet 并删除当前元素以外的其他元素

c# - 结构比 SortedSet 更快地添加 1-by-1,然后从末尾访问少量项目

algorithm - 将凸包分成两个独立的部分

r - 如何将向量与其自身卷积 n 次

algorithm - 二叉搜索树的顺序旋转

c# - 绕轴旋转点