红黑树学习总结2

红黑树学习总结2

——删除操作and前驱后继

前驱后继大致讲一讲,
意会一下就好。

前驱:

如果一个节点有左子树,前驱就是左儿子不停向右走,走到的点
否则是后继的反过来

后继:

如果一个节点的右子树,后继就是右儿子不断向左走,走到的点
否则是前驱的反过来

作为一棵平衡树,删除操作必不可少
继续引用百度百科的性质。

性质1. 节点是红色或黑色。
性质2. 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

- 为了避免不必要的情况,我们可以先找出红黑树中不可能的情况。

这里写图片描述
a到b子树内的叶子节点比到左边的NIL多经过了一个黑色节点,根据红黑树性质5,这是不可能的
所以,某节点A若只有一个儿子,这个儿子不能是黑的。
继续分类讨论
先看删除节点有两个儿子的情况
这里写图片描述
如图所示因为有两个儿子,所以被删除节点D的后继是在右子树中的最小值。
那么只要把节点D的权值与后继的权值对调,问题就变成了删除D的后继节点。
由于后继节点是右子树的最小值,所以可以保证后继节点的儿子数小于等于1
转化成了以下两种情况
这里写图片描述D有且仅有一个儿子
这里写图片描述(NIL为空节点)D为叶子节点
这时若D是红色节点,删除了并不会破坏平衡这里写图片描述
但如果删除的是一个黑色节点D,原来所有通过D的路径上黑色节点的数量都会减1,需要调整。
总的来说,分为5大状态。
黄色圈圈表示当前起始点,紫色节点表示可以是红也可以是黑色
这里写图片描述
这里写图片描述
当起始点跳到根或是调整完以后,不再调整,且作为任何操作都要设根节点的颜色为BLACK

写在最后

最初学红黑树的时候,我常常说学了红黑树就不用打SET了,打set不符合我的价值观。虽说学起来特别麻烦,特别是情况太多,但希望有更多的人不要图方便打SET,手打还是对程序速度有帮助的。

猜你喜欢

转载自blog.csdn.net/cjy_12/article/details/81840470
今日推荐