码迷,mamicode.com
首页 > 其他好文 > 详细

红黑树元素的插入和删除

时间:2016-08-16 22:05:38      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:

1.红黑树

       平衡搜索二叉树的查询性能很好。(注意:平衡和搜索是两个修饰词。平衡是左右子树高度差不差过1,搜索是对于任一节点来说,左子树所有节点值<节点值<右子树所有节点的值)红黑树就是在确保搜索性质前提下,通过特有的性质来保持平衡的这样一类树。

       重要的性质:

       根是黑的,叶节点是黑的。(大部分以null为叶节点)

       对于任意节点而言,其到叶节点树尾端(null指针)的每条路径都包含相同数量的黑节点。

       如果一个结点是红的,那么它的两个儿子都是黑的。

       红黑树的查找、删除、插入的时间复杂度最坏为O(logn)。

       当进行查找和删除时,可能会影响红黑树的性质,可能要对节点重新着色或左旋、右旋操作。

       插入时遇到的情况:

       a.父节点为R,叔叔节点为R

       b.父节点为R,叔叔节点为B,当前节点是右子

       c.父节点是R,叔叔节点是B,当前节点是左子

       处理方法:

        a.将父节点和叔叔节点涂黑,祖父节点涂红,把当前节点指向祖父节点,从新的当前节点开始算法。

        b.以当前节点的父节点作为新的当前节点,以新的当前节点左旋。

        c.父节点变为黑色,祖父节点变为红色,以祖父节点为支点右旋。

        红黑树的插入难点是插入之后的维稳,即成为一颗平衡的二叉树。

        红色节点需要有两个黑色子节点。

2.红黑树的删除

 情况1:x的兄弟w是红色的。


情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。


情况3:x的兄弟w是黑色的,w的左孩子是红色,w的右孩子是黑色。


情况4:x的兄弟w是黑色的,且w的右孩子时红色的。


针对情况1:x的兄弟w是红色的。
对策:改变w、p[z]颜色,再对p[x]做一次左旋,红黑性质得以继续保持。x的新兄弟new w是旋转之前w的某个孩子,为黑色。


针对情况2:x的兄弟w是黑色的,且w的俩个孩子都是黑色的。
对策:因为w也是黑色的,所以x和w中得去掉一黑色,最后,w变为红。
p[x]为新结点x,赋给x,x<-p[x]。


针对情况3:x的兄弟w是黑色的,w的左孩子是红色,w的右孩子是黑色。
对策:交换w和和其左孩子left[w]的颜色。 即上图的D、C颜色互换。:D
并对w进行右旋,而红黑性质仍然得以保持。
现在x的新兄弟w是一个有红色右孩子的黑结点,于是将情况3转化为情况4.


针对情况4:x的兄弟w是黑色的,且w的右孩子时红色的。
对策:做颜色修改,并对p[x]做一次旋转,可以去掉x的额外黑色,来把x变成单独的黑色,此举不破坏红黑性质。
将x置为根后,循环结束。

红黑树元素的插入和删除

标签:

原文地址:http://blog.csdn.net/yutianxin123/article/details/52171306

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!