我正在寻找指导如何在不使用虚节点的情况下实现红黑树中元素的删除(即叶节点实际上是空指针)。我在谷歌/维基百科和标准文献(sedgewick和cormen等)上找到的所有实现都使用虚拟NIL节点,我想避免使用它。
答案 0 :(得分:2)
对于插入,Okasaki的双红色消除开箱即用。像往常一样插入BST并继续消除双红色,直到到达根部。
删除红色节点绝不是问题。请注意,永远不会从BST中删除具有两个子节点的节点。如果删除带有一个孩子的黑色节点,请将孩子的颜色设置为黑色,然后就完成了。只删除黑叶(真实的,不是假人)是一个问题。 Matt Might's approach可以在没有虚节点的情况下工作。诀窍是首先使用马特的“冒泡”将叶子变成红色。然后简单地删除它。
Here是一个带代码的解决方案。