您的位置:首页 > 其它

红黑树(Red-Black tree)(插入与删除操作)

2015-07-09 00:39 405 查看
红黑树与平衡二叉树都是在二叉搜索树(Binary Sort Tree)的基础上而建立的。

前面讲了平衡二叉树(AVL),可以完美地实现将查找复杂度控制在O(logn)。但是AVL增加删除节点的时候,需要不断地判断左右树的高度差,这个频繁的操作降低了性能。为此提出了红黑树。什么样的树叫做红黑树呢?

红黑树需要满足以下五个性质(摘自算法导论):

1、每个节点不是红的就是黑的;

2、根节点是黑的;

3、每个叶子节点(也就是树的尾端NULL节点)是黑的;

4、如果一个节点是红的,那么左右子树均为黑的(需要注意的一点是,两个红节点不可能连接在一起)

5、对于每个节点,从此节点到叶子的所有路径的黑色节点数目均相同。

在了解如何构建红黑树前,依据其性质,有以下三种情形(ps:补充了算法导论里面缺少的情况)时,需要对红黑树进行修正,我画了一章图如下:



假设插入节点的为x,初始化节点为红,则其上级节点为父节点p[x],则上上级节点为祖节点p[p[x]]。则对此三种情形有以下描述:

case1:若父节点为红,且祖节点为黑,叔伯节点为红。这种情况下,祖节点变红,父节点与叔伯节点变黑。

case2:若父节点为红,祖节点为黑,不含有叔伯节点。如果是祖孙三代均在左,则右旋,父变为祖变黑,祖变为父的右子树,子变为父的左子树;如果是祖孙三代均在右,则左旋,父变为祖变黑,祖变为父的左子树,子变为父的右子树;

case3:若父节点为红,祖节点为黑,不含有叔伯节点,但父子树不在同一侧。则需要两次翻转,情形如图所示,不再赘述。

除了上面几种情形,可能旋转的时候含有左右节点的情况,有两种情况如下所示:



可以看出,上面节点的修正操作,与平衡二叉树(AVL)的操作类似,可以对比两者进行学习。

下面我们按照上面的描述生成一颗红黑树,插入的过程如下:



然后再插入13:



下面看一种较为复杂的情况,插入10的时候:



以上为插入生成一棵红黑树,下面来看下红黑树的删除节点的操作。

删除节点的时候,我们需要考虑待删除节点的颜色,删除红色节点的时候没有引起红黑树中各个性质的变化(就按照一般二叉查找树的删除进行);

如果删除的节点是黑色节点,这种情形下会引起红黑树的变化,为了描述删除的过程,我们需要对待删除的节点增加一个颜色称为附加色,怎么添加这附加色呢?下面为颜色变化的情况:



当x为红色,y为黑色的时候,则x的组成为红+黑;当x与y均为黑的时候,x的组成色为黑+黑。

当删除的节点为红节点或者为红+黑节点时候,只需要将红节点染黑,然后删除即可,操作如下:



如果删除的黑+黑的节点,需要进行修复红黑树 ,其实总共有八种情况,但是这八种又是两两对称镜像的,所以挑出其中的四种情况如下:

case1:删除节点x的父节点为黑,其兄弟节点w为红,兄弟节点的子节点均为黑。

先染红父节点,以父节点左旋,兄弟节点w变黑并成为为祖节点,w节点的左子树变成新的w节点(new w),然后就将状态1转换到了状态2,3,4。

case2:删除节点父节点可以是红的也可以是黑的,兄弟节点为黑,兄弟节点的子节点均为黑。

去掉x的一重黑色,然后将兄弟节点w染成红色,然后将x的父节点当成新的x节点(new x)。如果是由case1进入case2,此时父节点为红色,所以new x的颜色为红+黑,因此将x染红,在循环结束的时候将new x染成黑色。

case3:删除节点父节点可以是红的也可以是黑的,兄弟节点为黑,兄弟节点的子节点左子树为红,右子树为黑。

以w为旋转点,进行右旋,w的左子树变为新的w节点(new w),并由红染黑,w节点变为new w节点的右子树并染成红色,w原来的右子树不发生改变。现在对于x的情况是父节点的颜色未知,当前的w节点也就是new w的右子树为红色,进入case4。

case4:删除节点x的父节点c颜色未知,w节点颜色为黑,w的右子树为红,左子树颜色未知。

使得w的颜色变为x的父节点c的颜色,然后使x的父节点的颜色为黑,w的右节点为黑。然后以父节点c左旋,然后去掉x多余的黑色变为单一的黑色。至此所有的操作完成,将x设为根后,循环结束。



以上就是我对红黑树插入的理解,如果有不对的地方,欢迎指出!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: