Jac*_*ale 33 algorithm tree red-black-tree data-structures
完全理解标准二进制搜索树及其操作非常容易.由于这种理解,我甚至不需要记住那些插入,删除,搜索操作的实现.
我现在正在学习红黑树,我理解它保持树平衡的属性.但是我觉得很难理解它的插入和删除程序.
我理解在插入新节点时,我们将节点标记为红色(因为红色是我们可以做的最好的,以避免破坏较少的红黑树法则).新的红色节点可能仍然打破"没有连续的红色节点法则".然后我们通过以下方式解决
检查其叔叔的颜色,如果是红色,则将其父母和叔叔标记为黑色,然后去祖父母.
如果它是正确的孩子,左转其父
将其父母标记为黑色,将其祖父母标记为红色,然后向右旋转其祖父母.
完成(基本上像上面).
许多地方描述了如上所述的红黑树的插入.他们只是告诉你如何做到这一点.但为什么这些步骤可以修复树?为什么先左转,然后右转?
谁能更清楚地解释为什么对我更清楚,比CLRS更清楚?轮换的魔力是什么?
我真的希望这样理解,1年后,我可以自己实施红黑树,而无需查看书籍.
谢谢
Ser*_*tte 19
为了其他人阅读此帖子的人的利益,他们无法访问接受的答案中提到的书籍,我希望这是一个可接受的描述性答案.
旋转使树处于满足重新着色标准的状态(子节点有一个红色的叔叔).有两个主要区别:
当子节点没有红色的叔叔时,你必须旋转,因为如果叔叔节点已经是黑色,那么使父黑色将仅在祖父母的一侧增加黑色高度1.这将违反红黑树的高度不变性并使树不平衡.
现在让我们看看旋转如何转换树,以便我们有一个带有红色叔叔的子节点,并且可以使用重新着色.我建议用它来完全理解它.
在旋转和重新着色之前,你有一个黑色的祖父母,在A面(左边或右边)有2个红色节点和0个黑色节点,在B面有一个黑色节点(与A面相反).在旋转和重新着色之后,你有一个黑色祖父母,在A面有1个红色节点和0个黑色节点,在B面有1个红色节点和1个黑色节点.所以你基本上将其中一个红色节点移动到另一个子树祖父母不增加任何子树的黑色高度.
这是轮换的魔力.它允许您将额外的红色节点移动到另一个分支而不更改黑色高度,并且仍然保留二叉搜索树的排序遍历属性.
逻辑很简单.假设z为红色且z的父级为红色:如果z的叔叔为红色,则执行步骤1向上推动有问题的节点,直到(1)父级成为根.然后只需将根标记为黑色.完成或(2)z的叔叔是黑色的.
在情况(2)中,(a)z是其父节点的左子节点,则步骤3将是最后一步,因为满足了BST的所有属性.完成.或(b)z是其父母的正确子女.第2步将问题转换为案例(a).然后做第3步.完成.
因此,逻辑是试图达到案例(1)和(2a),以先到者为准.这些是我们了解解决方案的情况.