红黑搜索树

时间:2013-11-16 21:40:49

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

我正在实施一个红黑搜索树,如Introduction To Algorithms 3rd Edition所述。

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

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

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

删除2之前:

enter image description here

删除2:

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

未显示原始的.. leaf(null)节点。

            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:兄弟姐妹和兄弟姐妹的孩子都是黑人,但父母是红色的。在这种情况下,我们只需交换兄弟姐妹(红色)和父母(黑色)的颜色。

重新着色兄弟和父母:

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

正如您所看到的,只需删除具有两个叶节点子节点的节点即可进行简单的重新着色,并且不会更改树的形状。