\t\t红黑树原理详解(下)

来源:互联网 发布:linux命令行中文乱码 编辑:程序博客网 时间:2024/05/21 11:11

b :黑兄

     遇到黑兄就又麻烦了,我们又必须引入要删除的节点的侄子了。所以我们这里 再次细分为b1: 黑兄 双黑侄 b2: 黑兄 左黑侄右红侄 b3: 黑兄 右黑侄左红侄。 可能你会问b4呢,双红侄的情况呢?其实双红侄的情况同属于b2,b3的情况,所以 可以默认用 b2,b3其中一种情况来处理就可以了。

现在我们开始了

     b1黑兄 双黑侄

  红黑树原理详解(下) - 哼哈二将 - 尚武思文

注解:我们首先可以肯定的是父节点的左子树高度减一了,所以我们必须想方设法 来弥补这个缺陷如果我们把父节点的右子树高度也减一(兄变成红色)那么 父节点这颗树就可以保持平衡了,但整颗树的高度减一,所以我们可以判断, 如果父亲是红色,那么我们可以通过把父亲变成黑色来弥补这一缺陷。但如果 父亲是黑色呢,既然遇到到黑色了我们就只好往上遍历了。

方法:兄=>红;子=黑;    红父=>;

                                 往上遍历(黑父);

补充:其实子节点就是空节点,没有必要变。就算遍历上去,父节点也为黑

b2黑兄 左黑侄右红侄

  红黑树原理详解(下) - 哼哈二将 - 尚武思文
注解:绿色表示,颜色不影响修复的方式。依然我们可以肯定父节点的左子树高度减一,所以我们可以通过将父节点旋转下来并且变为黑色来弥补,但由于兄弟被旋转上去了,又导致右子树高度减一,但我们这有一个红侄,所以可以通过红侄变成黑色来弥补。父亲所在位置的颜色不变;(  红黑树原理详解(下) - 哼哈二将 - 尚武思文子为空)
方法:兄=>父色;父=>黑;侄=>黑;(子=>黑);左旋转父节点;

b3 黑兄 左红侄右黑侄

  红黑树原理详解(下) - 哼哈二将 - 尚武思文
注解:绿色表示,颜色不影响修复的方式。依然我们可以肯定父节点的左子树高度减一,同样我们通过父节点左旋转到左子树来弥补这一缺陷。但如果直接旋转的话,我们可以推出左右子树将不平衡(黑父),或者两个红色节点相遇(红父);这样将会更加的复杂,甚至不可行。因此,我们考虑首先将兄弟所在子树右旋转,然后再左旋转父子树。这样我们就可以得到旋转后的树。然后通过修改颜色来使其达到平衡,且高度不变。
方法:侄=>父色;父=>黑;右旋转兄;左旋转父;


总结:

如果我们通过上面的情况画出所有的分支图,我们可以得出如下结论

插入操作:解决的是 红-红 问题

删除操作:解决的是 黑-黑 问题

即你可以从分支图中看出,需要上遍历的情况为红红(插入)或者为黑黑黑(删除)的情况,,如果你认真分析并总结所有的情况后,并坚持下来,红黑树也就没有想象中的那么恐怖了,并且很美妙;


程序样列:

  红黑树原理详解(下) - 哼哈二将 - 尚武思文


点击这里下载
源码


声明:

        此文档为《C语言常用数据结构源代码全注解-红黑树源码》所写,此文档遵循GNU FDL协议,你可以修改重发,但因保留原始版权信息;

        此文档版本V1.0为初次发布,所以难面有错误的地方,如果你发现任何错误或缺点,非常感谢你发信息联系我。此文档仅供学习使用。


参考文献:

《百度百科 红黑树》                    地址:http://baike.baidu.com/view/133754.htm

C#与数据结构-树论红黑树地址:http://tech.ddvip.com/2008-12/1229486123100653_7.html

《資料結構與演算法()》            作者:呂學一

《資料結構與演算法()            红黑树大部分图片来源


版权信息:

本文来源:20065562's Blog 有水的地方就有余

文章转载自20065562's Blog请点击这里查看原文

地址:http://hi.baidu.com/20065562/blog/item/8777467e5292f30229388a0f.html

0 0
原创粉丝点击