为什么每次插入左斜红黑树后都需要将根着色为黑色?

时间:2019-01-10 00:27:12

标签: algorithm data-structures binary-search-tree red-black-tree

在Sedgewick的向左倾斜的红黑树(在他的paper或算法book中表示)中,对标准BST的一种修改是在每次插入后将根节点着色为黑色,请参见{ root.color = BLACK中的{1}}。

我理解从语义上讲这是必要的,因为根节点永远不能是3节点/ 4节点的左子节点。但是,我看不出为什么实际上需要这样做,因为似乎从未检查过根节点的颜色。有人可以指出我在这里缺少什么吗?

4 个答案:

答案 0 :(得分:2)

在检查了代码之后,我得出了与您相同的结论,即实际上从未使用过根色。

因此,我进行了一些测试以尝试确认这一点,并且在此过程中,我发现该白皮书中呈现的代码实际上存在许多小错误:对从未定义的方法的调用,对变量的赋值永远不会被声明,不必要的重复昂贵的方法调用,未使用的对象引用(=指针)等等。

当然,这些都不是一个非常严重的问题,因为它们都不需要花费很多精力来解决。但是我认为您的问题只有在代码 perfect 或接近完美时才有意义,而事实并非如此。鉴于该代码具有数十个编译错误和几个明显的非最佳位,其中不涉及红黑语义,因此我认为对它是否 really 需要以语义期望的方式设置根节点颜色。

但是就其价值而言,我的测试表明,根色确实无关紧要;我写了一个验证方法来验证适当的不变量(没有红色的 non-root 节点没有红色的子节点,并且所有叶节点的黑深度都相等),我发现无论是否保留了这些深度,是否注释掉将根颜色设置为黑色的行。 (当然,这仅在我测试的情况下得到了证明,但这仍然足以使我对结论有更大的信心。具体而言,我的案例涉及按顺序,反向或随机添加键1到1000。 -shuffled顺序,然后按顺序,相反顺序或以随机改组的顺序删除它们。我在每次单独插入或删除后验证了不变式。)

答案 1 :(得分:1)

这对于标准的红黑树似乎没有什么不同:约定是根应为黑色。这仅是一种约定,因为从理论上讲,根节点可以是(左侧)红色,而不会违反任何(其他)红黑树属性。这种颜色变化也不影响左倾红黑树的其他属性。

请参见Red-black tree - Wikipedia中的属性#2:

  
      
  1. 根是黑色的。有时会省略此规则。由于根始终可以从红色更改为黑色,但不一定相反,因此该规则对分析的影响很小。
  2.   

简而言之:将根节点染成黑色不是必需的,而是按照惯例完成的。

答案 2 :(得分:0)

我认为是因为您需要重建树,以使树为AVL。当您插入新节点时,可以将根节点更改为另一个节点,并需要为根重新着色。

答案 3 :(得分:0)

为根部黑色着色是简化需要执行的检查。如果将根着色为黑色并遇到红色冲突,则无需进一步测试即可知道当前节点的父级不是根,因此当前节点也具有祖父母。在我研究过的树木中,执行颜色检查要比检查当前节点是否为根要便宜得多。