上一篇讲了插入调整,现在来讲删除调整。红黑树的删除无疑是最难的,抛开调整,红黑树的插入删除都跟选择二叉树一样,所以前面的步骤网上很多了,在这里只讲如何调整,以满足红黑树性质。
还是从头到尾理一下吧...
先定义一下,删除节点为d,真实删除节点为reald,顶替节点为x,x的兄弟节点即前reald的兄弟节点为w。
找到要删除的节点d。
1.若d有一个子节点,则直接用d的子节点x顶替d以达到删除的目的。此时reald就是d。
2.若没有子节点,则直接用x(此时x为空节点)顶替d。此时reald就是d。
3.若有两个子节点,则寻找d的前驱或者后继reald(也是就是d的左子树下最大的节点或者右子树下最小的节点)。将后继节点reald的值赋给d,并删除reald(用reald的子节点x顶替reald)
上面就是选择二叉树的删除方法,红黑树的话只是多一步调整步骤。
删除后调整以满足红黑树性质
若真实删除的节点reald为红色,那么删除后对红黑树性质没有影响,则不用调整。
若reald为黑色
循环条件(顶替节点x不为root,且x的颜色为黑),跳出循环后记得将x颜色赋为黑!
1.如果顶替节点x为红色,则将x变为黑色,调整结束。
2.若顶替节x点为黑色
case1 若x的兄弟节点为红色(因为x顶替了reald,也就是原reald的兄弟节点为红)
=》
=》