一、红黑树的简介
红黑树是一种平衡的二叉查找树,是一种计算机科学中常用的数据结构,最典型的应用是实现数据的关联,例如map等数据结构的实现。
红黑树有以下限制:
1. 节点必须是红色或者是黑色
2. 根节点是黑色的
3. 所有的叶子节点是黑色的。
4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是红色
5. 从任意每个节点到其每个叶子节点的所有简单路径上黑色节点的数量是相同的。
要说明一下限制3。一般在红黑树中,每个节点空指针处还会加空的黑色的孩子(称为岗哨)。所以限制3一定成立。另外,我们下面说到的叶子节点指的是原本的叶子,而不是NIL节点。
二、红黑树的插入
下面这篇文章写得足够好了
http://www.cnblogs.com/xuqiang/archive/2011/05/16/2047001.html
三、红黑树的删除(准备知识)
由于删除比较复杂,先写准备知识垫一垫。
1 旋转
第一招:把弯的变成直的
第二招:左旋、右旋:主要的作用就是较深的子树让出一些深度给较浅的子树
2 一般查找二叉树删除节点
删除的方案有很多,但一般都会旋转下面这种,因为对整棵树各个分支深度的影响较小。
a.当被删除节点n是叶子节点,直接删除
b.当被删除节点n只有一个孩子,删除n,用孩子替代该节点的位置
c.当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍在前驱,或者说是左子树最大的节点,之后n的值替换为真正删除点的值。这就把c归结为a,b的问题。
3 由2可知,所有的删除问题都可以转化成删除叶子节点或单支节点(只有一个孩子)的问题
四、红黑树的删除
1 当删除节点n是红色的叶子节点,直接删除节点n,不影响红黑树平衡性质
2 当删除节点n是红色的单支节点。不可能出现,如果孩子是红色,违反限制4;如果孩子是黑色的,违反限制5.
3 当删除节点n是黑色的叶子节点,由于有岗哨的存在,可以转化为问题4
4 当删除节点n是黑色的单支节点,既n有一个黑色的子节点。
如下图,先说明一下记号,删表示被删除节点n,子表示其子节点,父,兄都很好理解了。黑色和红色表示真实的颜色,青色表示不确定的颜色。
首先我们很大胆地直接删掉节点n,让子接替他的位置。
我们瞻前顾后地看一下,首先红黑树的删除问题的所有情况都讨论到了,但是有一个问题,就是4中这样删除会使“父”节点左子树的黑色深度比右子树少1。
所以下面我们要解决的不是删除问题,而是一个红黑树的调整选转问题。要求是这样的,父节点的左孩子有一个黑色的节点,而且父节点的左子树黑色深度比右子树小1,要求调整它,是之满足红黑树限制。由于这个问题源于黑节点n有黑的子节点,我们称其为“双黑问题”。
4.1 红兄
x的兄弟w为红色,则w的儿子必然全黑,w父亲p也为黑。
改变p与w的颜色,同时对p做一次左旋,这样就将情况1转变为情况2,3,4的一种
4.2,4.3.4.4统称为黑兄问题
4.2 黑兄二黑侄 又分为4.2.1和4.2.2
4.2.1 黑兄二黑侄红父
p变成黑色,w变成红色,解决问题
4.2.2 黑兄二黑侄黑父
因为x子树相对于其兄弟w子树少一个黑色节点,可以将w置为红色,这样,x子树与w子树黑色节点一致,保持了平衡。
如果p有兄弟,它的黑色深度就会比兄弟小1,这样4.2.2又转化成为了一个双黑问题,规约为1-4的情况。
4.3 黑兄左红侄右黑侄
w为黑色,w左孩子红色,右孩子黑色。
交换w与左孩子的颜色,对w进行右旋。转换为情况4
4.3 黑兄右红侄
由于是双黑问题的子情况,从左图可看出,“子”子树和“1”、“2”子树的黑色深度是一样的。
所以调整后的子树是满足红黑树的限制的。(既新“父”子树两侧黑色深度相等,新兄子树也是如此)
参考文章
http://blog.csdn.net/spch2008/article/details/9338923
http://blog.csdn.net/very_2/article/details/5722682