左倾红黑树的删除及其不变量

问题描述

我很难理解this paper的声明

为此,我们保持当前节点或其 左子是红色的。我们可以向左移动,除非当前 节点为红色,左子代和左子代均为黑色。在 在这种情况下,我们可以进行颜色翻转,从而恢复不变 可能会在右侧引入连续的红色

我了解到,从叶节点到根的每条路径必须具有相同数量的黑色链接/节点,并且本文的策略是用红色为我们要删除的那根树上色,然后固定树。但是我仍然有以下问题:

  1. 为什么不变性是当前节点是红色还是current.left是红色?

  2. 更具体地说,对于辅助函数moveRedLeft,为什么它要特别注意current.left.right的颜色,如果此节点为红色,则必须进行2次旋转和一次翻转。(移动移动功能

    enter image description here

解决方法

为什么不变性是当前节点是红色还是current.left是红色?

这是一个选择,它描述了算法的特征。当然,如果您盲目地沿树向下移动,则无法保证此不变性成立,因为您可能会到达当前节点及其左子节点均为黑色的位置。但是,该算法将保持不变性作为目标,因为它有助于在仍在操纵它的情况下保持在有效的黑红色树的规则之内。

如果current =红色,current.left =黑色,current.left.left =黑色,为什么我们不能向左移动?

如果我们向左移动,则将到达当前节点及其左子节点均为黑色的状态,这将违反不变量。

为什么颜色翻转会保持这种不变性?

当算法到达上述“阻塞”状态时,颜色翻转会将当前红色节点变为黑色,其子节点变为红色。这样就保持了不变式(左边的子代现在是红色的),我们现在可以在保持不变的情况下向左移动:向左移动后,我们会得到 current 节点为红色的状态。>

请注意,此颜色翻转可能会使树处于无效状态,因为(向下移动之前)current.left.right节点可能是红色的,并且由于它是该翻转后变为红色的节点的子节点,现在这违反了红色节点可能没有红色子节点的规则。文章继续说明算法如何解决无效状态...