算法导论红黑树之删除详解

红黑树的删除代码就不写了,细节太多了,说说自己对删除的了解算了。

这里不贴代码了,跟着算法导论的伪代码基本写的出来,唯一一点不好的就是,这里要考虑很多细节,叶子节点,根节点的父节点。

我们假设是在红黑树中删除一个节点y,根据二叉树里面删除有一个性质:如果一个节点有两个节点,那么他的后继没有左子树。根据二叉树的删除的步骤来对红黑树的删除进行考虑的话,红黑树y节点是只会有一个节点,这里记做x,那么我们删除y如果是红色的话,不会对整棵树有影响,但是如果删除的y为黑色的话,就会有很大的影响了,具体的影响可以分为下面几类:1)节点x为红色的话,可能的效果是p[x]为红色。影响红黑树的性质;

2)节点为红色的话,如果删除之后节点x变为了根节点呢?影响;

3)影响了黑高度;

下面根据上面的三种效果做出相应的补救,目的只有一个:使整棵树满足红黑树的5个属性;

对于1)节点x为红色:直接把节点x染成红色即可。原因是:因为y下就x一根独苗,那么把y删除之后原来的红黑树的y分支黑高度少了;加上一个不就可以了么。况且添加黑色是不对下面的子树有什么颜色要求的。

对于2)节点x成为了根节点的话,也是使用上面的方法,直接染色就可以了;那么整体的黑高度还是不变。也就是说y原来是红黑树的根节点,y下面就是一个x,那么x为红色,只需要染黑,使根节点不为红即可;

对于3)因为删除了y对于x分支的确影响了黑高度,但是对于这里的话还是要有两个不同的讨论:(1)x为根节点,(2)x不为根节点

对于3.1而言的话,很简单,染黑;

对于3.2而言的话,就要分几种情况讨论了,也就是算法导论里面的四种情况:1.x的兄弟节点为红;2x的兄弟节点为黑,但是兄弟节点两孩子为黑3。兄弟节点为黑,左孩子为红,右孩子为黑4.兄弟节点为黑,右孩子为黑;

那么对于上面的四种情况可以如下讨论:由于整个x分支上面黑高度是比别的分支少了一个1,那么算法导论上面的做法是另x具有另一重额外的黑色属性,就是这个属性让这个分支的黑高度于别的一样,当然,这里的另一重属性是我们虚拟的,最终结果上还是要修改出来才可以达到的。此外我们还要明确一点就是这讨论的x是本身颜色属性为黑的,见上面的分类讨论;还有一点就是这个讨论的四种情况是归纳了所有x为黑的情况,所以可以解决。

由于这里考虑的仅仅是针对于x非根节点的黑色的情况。(x为根节点以及为红色情况前面讨论了,甚至算法导论上面只给出了一行用以解决即第23行伪代码),那么这里应该说唯一要解决的就是怎么让x分支的黑高度上升,别的分支的黑高度不变的宗旨,我们下面可以看见的就是面对这四种情况,最后的效果要么是转换为另一个情况,要么是最后的最后x下的分支变化加了一二其他分支是未变的。下面是图解以及说明。

3.2.1:

当x的兄弟节点为红色,那么它的两孩子们必须是黑色的。(因为除了删除的那个x分支部分,少了一个1的黑高度,其他分支还是精神正常的)这种情况下,我们做的步骤最终目标是让x分支黑点数加一,步骤可以有换颜色,以及旋转。通过下面的图我们可以看见的是每一个分支上黑的点的个数(假设x具有的是双重黑)。也就是跟之前的结构相比较红黑树还是在x分支少一个黑节点(不考虑我们意想的那个多一重节点,但是下面图还是补上了。我们当做是最终的目标黑节点数把):然后经过这个就成为了第二种情况。

3.2.2:

x的兄弟节点w为黑色,w两个孩子节点是黑色.那么这里的话还是抱着那个宗旨,让x的分支上的黑节点数(不考虑意想的多一重黑)增加1,其他的不变化。由于这个情况是可以作为一个单独考虑的,虽然算法导论里面是把它当做了一种情况一进化而来的考虑,由情况1进化而来的话,p[x]为红色,但是实际上p[x]可以为黑色。下面分两个情况谈论:当p[x]为红色的话,那么可以理解为由情况1进化而来,也可以考虑单独出现。那么这里的话我们可以看下面的图(标出了一开始以及最后的黑节点数)。一开始x为双重黑色,把x和W的颜色推掉一层,x变为黑,w变为红色,,接着把p[x]的颜色补上一层黑,给人的感觉是整体的黑高度和原来没变,但是这里实际上是变化了,因为x分支上如果没有所谓的双重颜色,褪去一层就为红,但是这里等于是在原来的x出人为补上一个黑,当然,现在的也就是最终的x的颜色为红黑,颜色属性虽然为红,但是随着这个节点的颜色渐渐的上移,最后还是会被染黑,所以实际上也就是x分支,人为的加了一个黑节点。可以自己看下图。

3.23

x的兄弟节点w为黑色,w的两个孩子左孩子为红色,右孩子为黑色。还是记住那个宗旨。这里的话是不考虑p[x]颜色的。p[x]可以为红可以为黑,具体的可以见下图,这里假设p[x]为红。


3.2.4w的右孩子为红,实际上这里是另外的一种结束的情况了,那么这里本来在x出意想的是2个黑点(实际上是一个),但是最后你可以看看x分支它们得到的黑节点数是多了一个1的。那么具体的红黑的数和删除前还是没变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值