红黑树(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设为根后,循环结束。


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


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

Red-Black Tree红黑树(插入操作)

插入操作可能会造成不平衡。 为了使数平衡,AVL树需要rotate操作。那么红黑树怎么弄呢?红黑树需要: 1)recoloring 2) rotate 下面举例说明 假设x是新插入的节点。 ...
  • bdss58
  • bdss58
  • 2014年12月12日 16:00
  • 459

红黑树(Red Black Tree)

  • 2017年02月13日 11:13
  • 199KB
  • 下载

红黑树(Red Black Tree)

介绍 今天我们来介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,当时被称为平衡二叉B树(symmetric binary B-trees...
  • tuzi37
  • tuzi37
  • 2013年12月26日 16:25
  • 573

红黑树(red black tree) Common Lisp 实现

学习Lisp的过程中,作为练习,我经常实现一些小东西。 这个红黑树就是我玩Lisp时搞出来的东西。作为一个代码 玩具,她的实现有些随意,尤其变量名。虽然只是 一个代码玩具,但她完整的实现和演示了...

红黑树(red-black tree)

红黑树是一种自平衡二叉查找树,它能保证在最坏的情况下,基本的动态集合操作(search,insert,delete,predecessor,successor,minimum,maximum)的时间复...

从2-3-4树谈到Red-Black Tree(红黑树)

在上一篇文章--从B树、B+树、B*树谈到R 树里已提到2-3-4树,那么本文,咱们就从2-3-4树开始谈起,然后谈至红黑树。因为理解了2-3-4树,红黑树也就没有任何问题了。同时,虽然红黑树在本bl...

C#与数据结构--树论--红黑树(RED BLACK TREE)

C#与数据结构--树论--红黑树(RED BLACK TREE)   介绍 今天我们来介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf Bayer于1972年发明,...

红黑树(red-black tree)算法,附AVL树的比较

【转】【经典】 导读:   linux内核中的用户态地址空间管理使用了红黑树(red-black tree)这种数据结构,我想一定有许多人在这种数据结构上感到困惑,我也曾经为此查阅了许多资料...

红黑树(Red Black Tree)

1. 概述 一棵二叉树如果满足下面的红黑性质,则为一棵红黑树[1]: 1)每个节点或是红的,或是黑的 2)根节点是黑的 3)每个叶节点(NIL)是黑的。 4)如果一个节点是红的,则它的儿子都是黑的 5...
  • yzf0011
  • yzf0011
  • 2017年02月13日 16:40
  • 191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:红黑树(Red-Black tree)(插入与删除操作)
举报原因:
原因补充:

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