我正在实施一个红黑搜索树,如Introduction To Algorithms 3rd Edition所述。
我遇到一个问题,即删除没有子节点的节点后树没有正确重新着色。在页324上描述了RB-DELETE功能。如果节点是叶节点,则它的子指针指向特殊的空节点。
我不明白的是,当这个函数在叶子节点上运行时,它会将空节点分配给x,然后用null子树替换该节点,从而改变null的父指针。最后,它在null上运行fixup方法。
不应该编辑空节点是非法的吗?我不明白,为什么不起作用?
删除2之前:
删除2:
答案 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)
正如您所看到的,只需删除具有两个叶节点子节点的节点即可进行简单的重新着色,并且不会更改树的形状。