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

本文详细解析了红黑树的插入与删除过程,包括红黑树的性质、修正操作以及删除节点时的颜色变化。通过具体示例,展示了如何在保持树的平衡的同时,高效地进行节点操作。

红黑树与平衡二叉树都是在二叉搜索树(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设为根后,循环结束。


以上就是我对红黑树插入的理解,如果有不对的地方,欢迎指出!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值