标签:
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