红黑树的插入和删除

一、红黑树的简介

红黑树是一种平衡的二叉查找树,是一种计算机科学中常用的数据结构,最典型的应用是实现数据的关联,例如map等数据结构的实现。

红黑树有以下限制:

1. 节点必须是红色或者是黑色

2. 根节点是黑色的

3. 所有的叶子节点是黑色的。

4. 每个红色节点的两个子节点是黑色的,也就是不能存在父子两个节点全是红色

5. 从任意每个节点到其每个叶子节点的所有简单路径上黑色节点的数量是相同的。

要说明一下限制3。一般在红黑树中,每个节点空指针处还会加空的黑色的孩子(称为岗哨)。所以限制3一定成立。另外,我们下面说到的叶子节点指的是原本的叶子,而不是NIL节点。

二、红黑树的插入

下面这篇文章写得足够好了

http://www.cnblogs.com/xuqiang/archive/2011/05/16/2047001.html

三、红黑树的删除(准备知识)

由于删除比较复杂,先写准备知识垫一垫。

1 旋转

第一招:把弯的变成直的

         

第二招:左旋、右旋:主要的作用就是较深的子树让出一些深度给较浅的子树

     

2 一般查找二叉树删除节点

删除的方案有很多,但一般都会旋转下面这种,因为对整棵树各个分支深度的影响较小。

a.当被删除节点n是叶子节点,直接删除

b.当被删除节点n只有一个孩子,删除n,用孩子替代该节点的位置

c.当被删除结点n存在左右孩子时,真正的删除点应该是n的中序遍在前驱,或者说是左子树最大的节点,之后n的值替换为真正删除点的值。这就把c归结为a,b的问题。

3 由2可知,所有的删除问题都可以转化成删除叶子节点或单支节点(只有一个孩子)的问题

四、红黑树的删除

1 当删除节点n是红色的叶子节点,直接删除节点n,不影响红黑树平衡性质

2 当删除节点n是红色的单支节点。不可能出现,如果孩子是红色,违反限制4;如果孩子是黑色的,违反限制5.

3 当删除节点n是黑色的叶子节点,由于有岗哨的存在,可以转化为问题4

4 当删除节点n是黑色的单支节点,既n有一个黑色的子节点。

如下图,先说明一下记号,删表示被删除节点n,子表示其子节点,父,兄都很好理解了。黑色和红色表示真实的颜色,青色表示不确定的颜色。

首先我们很大胆地直接删掉节点n,让子接替他的位置。

我们瞻前顾后地看一下,首先红黑树的删除问题的所有情况都讨论到了,但是有一个问题,就是4中这样删除会使“父”节点左子树的黑色深度比右子树少1。

所以下面我们要解决的不是删除问题,而是一个红黑树的调整选转问题。要求是这样的,父节点的左孩子有一个黑色的节点,而且父节点的左子树黑色深度比右子树小1,要求调整它,是之满足红黑树限制。由于这个问题源于黑节点n有黑的子节点,我们称其为“双黑问题”。

4.1 红兄

x的兄弟w为红色,则w的儿子必然全黑,w父亲p也为黑。

改变p与w的颜色,同时对p做一次左旋,这样就将情况1转变为情况2,3,4的一种

4.2,4.3.4.4统称为黑兄问题

4.2 黑兄二黑侄 又分为4.2.1和4.2.2

4.2.1 黑兄二黑侄红父

p变成黑色,w变成红色,解决问题

4.2.2 黑兄二黑侄黑父

因为x子树相对于其兄弟w子树少一个黑色节点,可以将w置为红色,这样,x子树与w子树黑色节点一致,保持了平衡。

如果p有兄弟,它的黑色深度就会比兄弟小1,这样4.2.2又转化成为了一个双黑问题,规约为1-4的情况。

4.3 黑兄左红侄右黑侄

w为黑色,w左孩子红色,右孩子黑色。

交换w与左孩子的颜色,对w进行右旋。转换为情况4

4.3 黑兄右红侄

由于是双黑问题的子情况,从左图可看出,“子”子树和“1”、“2”子树的黑色深度是一样的。

所以调整后的子树是满足红黑树的限制的。(既新“父”子树两侧黑色深度相等,新兄子树也是如此)

参考文章

http://blog.csdn.net/spch2008/article/details/9338923

http://blog.csdn.net/very_2/article/details/5722682

时间: 2024-11-08 18:53:43

红黑树的插入和删除的相关文章

红黑树的插入与删除

红黑树(Red Black Tree) 是一种自平衡二叉查找树.红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能.红黑树可以在O(log n)时间内完成查找,插入和删除操作. 二叉搜索树可以看 二叉搜索树 AVL树可以看 AVL树的插入与删除 1. 红黑树的性质 红黑树的自平衡依赖于它的以下性质: 性质1. 结点是红色或黑色. 性质2. 根结点是黑色. 性质3. 每个结点节点(NIL结点,空结点,与其它二叉搜索树不同,红黑树将叶子结点的孩子

红黑树从头至尾插入和删除结点的全程演示图

红黑树插入和删除结点的全程演示 作者:July.saturnman.时间:二零一一年三月二十八日.出处:http://blog.csdn.net/v_JULY_v.声明:版权所有,侵权必究.----------------------------------- 引言: 目前国内图书市场上,抑或网上讲解红黑树的资料层次不齐,混乱不清,没有一个完整而统一的阐述.而本人的红黑树系列四篇文章(详见文末的参考文献),虽然从头至尾,讲的有根有据,层次清晰,然距离读者真正做到红黑树了然于胸,则还缺点什么. 而

红黑树的插入

一.红黑树的介绍 先来看下算法导论对R-B Tree的介绍: 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black.通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的. 前面说了,红黑树,是一种二叉查找树,既然是二叉查找树,那么它必满足二叉查找树的一般性质.下面,在具体介绍红黑树之前,咱们先来了解下 二叉查找树的一般性质:1.在一棵二叉查找树上,执行查找.插入.删除等操作,的时间复杂度为O(

红黑树之插入

1.红黑树 (1).概念 i>每个结点不是红的就是黑的: ii>根结点为黑的: iii>红结点的孩子必为黑结点: iv>(除了根结点)任一结点不管通过什么路径,到达叶子节点的黑结点数目一定相同: 总结概括:一头一脚黑,黑同红不连:根为黑,到脚(叶子节点)的黑结点相同,红结点不相连: 2.递归--->一般先写if结束语句 化非递归------>用while()循环和栈; enum{RED, BLACK}; 这个枚举是有值得,分别为0.1: 3.红黑树与AVL树  AVL树

图解集合7:红黑树概念、红黑树的插入及旋转操作详细解读

原文地址http://www.cnblogs.com/xrq730/p/6867924.html,转载请注明出处,谢谢! 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题. 尽管如此,HashMap与LinkedHashMap还是有自己

红黑树(2) - 插入操作

1.插入介绍 首先以二叉排序树的方法增加节点并标记它为红色.(为何不是红色?因为如果设为黑色,就会导致根到叶子的所有路径中,有一条路径上会多出一个额外的黑节点,这个是很难调整的).但是,设为红色节点后,可能会导致出现两个连续红色节点的冲突,则可以通过重新着色和旋转来调整.具体的调整操作取决于其他临近节点的颜色. 下面分析一下插入新节点后可能对红黑树性质产生的影响: 性质1-节点是红色或黑色.和性质3-所有叶子都是黑色.这两条总是可以维持不变. 性质4-每个红色节点的两个子节点都是黑色.只在增加红

红黑树的插入和遍历时间复杂度分析

红黑树的插入和遍历时间复杂度分析 在平常的工作中,最常用的一种数据结构恐怕是std::map了.因此对其的时间复杂度分析是有必要的,编写程序时做到心中有底. 一.理论分析 在stl中std::map和std::set都采用红黑树的方式实现.我们知道插入一个元素到红黑树的时间为log(N),其中N为当前红黑树的元素个数,因此,采用插入方式构建元素个数为N的红黑树的时间复杂度为: log(1) + log(2) + log(N-1) = log((N-1)!) = Nlog(N) 那么采用迭代器遍历

红黑树、插入删除操作

二叉排序树 一棵自平衡的二叉排序树(二叉搜索树) 生成二叉排序树的过程是非常容易失衡的,最坏的情况就是一边倒(只有右/左子树),这样会导致二叉树的检索效率大大降低(O(n)). 为了维持二叉树的平衡,有各种的算法,如:AVL,SBT,伸展树,TREAP ,红黑树等等. 红黑树 红黑树需要满足5条性质: - 节点非红即黑 - 根节点是黑色 - 所有NULL结点称为叶子节点,且认为颜色为黑 - 所有红节点的子节点都为黑色,一条路径上不能出现相邻的两个红色结点 - 从任一节点到其叶子节点的所有路径上都

红黑树(三)删除

删除操作比插入复杂一些.首先我们先来了解一些红黑树的特性.这些是我随意列举的,供大家参考. 1.红色节点的父亲黑孩子一定是黑色.(nil是黑节点) 2.单支节点,只能是黑红.(红黑,黑黑,不符合规则4,到树尾黑节点个数相同) 3.真正的删除节点一定是单支节点或者叶子节点.(没有孩子的节点) 接下来我们讲如何找真正的删除节点. 有左右子树的情况 如果8是删除节点,那么10就是真正的删除节点. 查找方法是,找8节点的右子树中的最小的节点,根据二叉树的性质,我们可以知道,8节点的右孩子的左孩子的左孩子