分类: C/C++
2011-08-22 00:15:41
红黑树的删除远比插入要复杂的多,还是基于算法导论上面进行分析,如普通二叉搜索树一样,需要先将其从二叉树中删除,然后在进行颜色调整,以满足上面的五条性质。
在删除过程中,需要分为四种情况进行考虑:
1. 只有左孩子存在
2. 只有右孩子存在
3. 两孩子均存在
4. 两孩子均不存在
如果为前两种情形时,只需将其对应的孩子的父节点指向其父节点的双亲,如果是第三种情况,则需要去查找该节点的后继节点,然后利用后继节点来进行替换该节点,第四种情况最简单,直接将该节点对应父节点的孩子置为空。
首先下面是普通的删除源码
在删除时,如果被删除的节点y为黑色(记删除的节点为x),可能会出现三种情况:
1. 如果y是根,y的红色节点孩子成为了新的根,这样就违反了属性2。
2. 如果x和p[y]都是红色,这样就违反了属性4.
3. 如果删除y这样就导致y的路径上包含少的黑色节点,这个问题通过记节点x有”两个黑色节点”来进行解决,如果x为红色,则该节点的个数为1,否则记为2.
在进行删除时,主要有下面几种情形:
1. x的兄弟为红色
2. x的兄弟节点w为黑色,且w节点的两个孩子都是黑色
3. x的兄弟节点w为黑色,且w的左孩子是红色,右孩子为黑色
4. x的兄弟节点w为黑色,且w的右孩子为黑色
当第一种情况时,示意图如下:
对应处理代码如下:
第二种情形如下:
相应处理代码如下:
第三种情形如下:
对应处理代码如下:
第四种情形:
对应代码如下:
算法导论(所有的分析都来自这里)
Linux2.6.24源码
Algorithm(详细介绍了红黑树的由来)
多任务下的数据结构和算法