【问题标题】:Red Black Search Trees红黑搜索树
【发布时间】:2013-11-30 05:08:54
【问题描述】:

我正在实现如Introduction To Algorithms 3rd Edition 所述的红黑搜索树。

我有一个问题,即在删除没有子节点的节点后,树没有正确重新着色。第 324 页描述了 RB-DELETE 功能。如果一个节点是叶节点,它的子指针指向一个特殊的空节点。

我不明白的是,当这个函数在叶子节点上运行时,它会将空节点分配给x,然后用null的子树替换节点,从而改变null的父指针。最后,它在 null 上运行 fixup 方法。

编辑空节点不应该是非法的吗?还有什么我不明白,为什么它不起作用?

删除前2:

删除2后:

【问题讨论】:

  • 我了解 RB 树,但我不太确定你在问什么,你能以图表的形式举个例子吗?
  • i.imgur.com/nnyh8IX.png> 这是删除节点之前的树。要删除的节点是2。 i.imgur.com/EnMULSy.png> 这是在delete 和delete-fixup 函数之后。如果我尝试遍历伪代码,我不明白为什么不应该发生这种情况,但是生成的树是非法的红黑树,因为从根到空节点的路径不包含相同数量的黑色节点。
  • 我认为您误解了“删除没有子节点的节点”。所有叶子都有空值(从技术上讲不能删除)并且是黑色的。您正在删除确实有子节点(两个空子节点)的节点 2。请参阅下面的答案。
  • 叶子的复数形式是叶子。

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


【解决方案1】:

查看您发布的两个 PNG 并没有加起来。

在你的图片中,删除 2 后发生了一些变化。根由 5 变为 7,7 由红色变为黑色。

原始..叶(空)节点未显示。

            5(B)
    3(R)             7(R)
2(B)    4(B)     6(B)        9(B)
                         8(R)    11(R)

当你删除节点 2 时:

子树来自...

    3(R)
   /   \
2(B)    4(B) 

到...

       3(R)
      /   \
null(B)    4(B) 

去掉2后:

            5(B)
    3(R)             7(R)
        4(B)     6(B)        9(B)
                         8(R)    11(R)

删除案例 4:Sibling 和 Sibling 的孩子是黑色的,但 Parent 是红色的。在这种情况下,我们只需将 Sibling(变为红色)和 Parent(变为黑色)的颜色进行交换。

重新着色同级和父级后:

            5(B)
    3(B)             7(R)
        4(R)     6(B)        9(B)
                         8(R)    11(R)

如您所见,简单地删除具有两个叶节点子节点的节点是一种简单的重新着色,不会改变树的形状。

【讨论】:

  • 但是,tre 违反了从根到叶的所有路径必须包含相同数量的黑色节点的不变量,以及所有红色节点必须有两个黑色子节点的不变量。
  • @Boz0r 是的,你说对了一半;每个叶子的相同数量的黑色节点无效,但节点 3 确实有两个黑色子节点,因为每个叶子节点都是黑色的。根据维基百科,这似乎是删除的案例 4。 en.wikipedia.org/wiki/Red%E2%80%93black_tree
  • 我在我的代码中发现了问题。在第 326 页第 12 行的 RB-DELETE-FIXUP 的伪代码中。它说 else if 而不是 elseif,所以它是一个 else { if () {}}。非常感谢您的帮助。
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 2011-08-29
  • 2018-06-30
  • 2010-09-06
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多