数据结构 之 红黑树的删除操作(二)

转载自:https://mp.weixin.qq.com/s/waFh-_7Q3EiFdUfXawm4Ww

一、二叉查找树的删除

情况1,待删除的节点没有子节点:直接删除即可

情况2,待删除的节点有一个孩子节点(左右孩子均可):直接让孩子节点取代要删除的父节点即可

上图中,待删除的节点13 只有一个左孩子节点,我们让左孩子节点11直接取代被删除的节点,节点11以下的节点关系无需变动。

情况3,待删除的节点有两个孩子节点:
①先选择合适的节点来取代被删除的节点,习惯上选择仅大于被删除节点的节点
②复制选中的节点到被删除节点的位置
③若选中的节点没有子节点,直接删除,满足情况①;若选中的节点有子节点。因为这个节点仅大于被删除的节点,所以只会有一个右孩子节点。直接取代即可,满足情况②。

示例:

上图中,待删除的节点5 有两个孩子节点。
①我们先选择与待删除节点最接近的节点来取代它。结点3仅小于节点5,节点6仅大于节点5,是最接近待删除节点的节点。习惯上我们选择仅大于待删除节点的节点,也就是节点6 来取代待删除节点5。
复制节点6 到原来节点5的位置

③被选中的节点6 ,仅大于节点5,因此一点没有左孩子。所以我们按照情况1或情况2,直接删除复制前的节点6即可

二、红黑树的删除

红黑树与二叉查找树不同:红黑树为了保持相对平衡,设计了很多特殊规则,在删除某一结点后,某些规则会被打破,这时候我们还需要进行一些列的调整。

第一步、如果待删除节点有两个非空的孩子节点,转化为待删除节点只有一个孩子(或没有孩子)的情况。

上图中,①待删除节点8 有两个孩子节点,我们选择仅大于待删除节点的节点10 来取代节点8 的位置,节点颜色变成待删除节点的颜色。

②接下来我们看要删除的红色节点10。红色节点10能成为仅大于8的节点,必然没有左孩子节点,所以问题转换成了删除只有一个右孩子节点(或没有孩子节点)的情况。进入第二步。

第二步:根据待删除节点和其唯一子节点(右孩子)的颜色,分情况处理:
情况1、自身是红色,子节点是黑色


这种情况最简单,按照二叉查找树的删除操作,删除节点1即可。

情况2、自身是黑色,子节点是红色

首先按照二叉查找树的删除操作,删除节点1

此时,这条路径凭空减少了一个黑色节点,那么我们把节点2变成黑色即可。

情况3、自身是黑色,子节点也是黑色,或者子节点是空叶子节点

这种情况比较复杂,涉及到很多变化。首先我们还是按照二叉查找的删除操作,删除节点1。

显然,这条路径上少了一个黑色节点,而且节点2再怎么变色也解决不了。这时候,我们进入第三步,专门解决父子双黑的情况。

第三步、遇到双黑节点,在子节点顶替父节点只会,分成6种子情况处理。
情况1、节点2是红黑树的根节点


此时所有路径都减少了一个黑色节点,并未打破规则,不需要调整。

情况2、节点2的父、兄弟、侄子节点都是黑色

首先把节点2的兄弟节点B变色成为红色

这样一来节点2所在的路径少了一个黑色节点,节点B所在的路径也少了一个黑色节点,”扯平“了。但是节点A以下的每一条路径都减少了一个黑色节点,与节点A之外的其他路径又造成了新的不平衡。没关系,我们让节点A扮演原来节点2的角色,进行递归操作,重新判断各种情况。

情况3、节点2的兄弟节点是红色

首先以节点2的父节点A为轴,进行左旋

然后变色,节点B变成黑色,节点A变成红色

这样的变化可能转换成情况4、5、6中的任意一种,在下列情况中进一步解决。

情况4、节点2的父节点是红色,兄弟和侄子节点是黑色

直接让节点2的父节点变色为黑色,兄弟节点B变色为红色

这样一来,结点2的路径补充了黑色结点,而结点B的路径并没有减少黑色结点,重新符合了红黑树的规则。

情况5、...

以上就是红黑树删除的全过程。记思路即可,天

三、删除示例

调整:

①找到仅大于待删除节点的25
②将节点25替代节点17,删除原来的节点25

③这时候旋转节点25怎么转都转不对。所以换一个思路。以节点15为轴做一个左旋

④再以节点25为轴,右旋。
⑤将节点16变色,为黑色,完成,重新符合了红黑树的规则。


猜你喜欢

转载自blog.csdn.net/qq_37358143/article/details/106328054