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

原创 2015年07月09日 00:39:22

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


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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

apache与Nginx的主要区别(内核多路I/O之select与epoll的区别)

高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据一些人的测试,Nginx + PHP(FastCGI) 可以承受3万以上的并发连接...

平衡二叉树(AVL)

二叉排序树可以完美地生成一个二叉树,但是会有一种极端的情况。就是会生成一棵斜树,这种情况下,树的深度很大,会和节点数一样大。那么查找一个元素的算法复杂度达到O(n)。这种效率比较低,如果生成一棵类似于...

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树

B树与B+树

二叉搜索树、平衡二叉树、红黑树都属于二叉树,由于每个节点只有一个元素,每个节点只能连接两个节点。对于像文件系统、数据库这样需要数目庞大读写删除操作,如果采用这种数据结构将会大大降低系统的效率,遇到I/...

二叉树的性质极其二叉树的构建、各种遍历以及深度宽度的求解

学了忘记,忘记了又来翻书。还是mark一下吧。是不是都会用到。 性质1:二叉树的第i层上至多有2的i-1次方个节点。 性质2:深度为n的二叉树至多有2的n-1次方个节点。 性质3:对于任何一个二叉树,...

轻松搞定面试中的二叉树题目

版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比较重要的数据结构,尤其是二叉树...

二叉搜索树(Binary Sort Tree)

在操作数据库的时候,经常进行大量的插入删除操作,我们希望达到的效果是能够对其中的某些元素操作,而不影响其他元素的位置,使表中的元素的移动达到最小,这里面一般使用的数据结构就是动态查找表。什么结构能够实...

关于树的总结从二叉树->二叉搜索树->平衡二叉树->红黑树->B树与B+树

二叉树的定义与性质,包括各种操作的源代码在本博客的的此处:二叉树 二叉搜索树(Binary Search Tree)的定义性质以及源码实现在本博客此处:二叉搜索树 平衡二叉树(AVL树),是一棵完全二...

红黑树(Red Black Tree)

  • 2017-02-13 11:13
  • 199KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)