`
iwebcode
  • 浏览: 2008801 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

红黑树

 
阅读更多

红黑树是AVL树的变种,具体定义如下:红黑树也是一棵二叉查找树,要满足一下性质

(1)每个节点或者是黑色,或者是红色。

(2)根节点是黑色。

(3)每个叶子节点(NIL)是黑色。

(4)如果一个节点是红色的,则它的子节点必须是黑色的。

(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

定义:从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度,记为bh(x)

红黑树的黑高度定义为bh(root).

定理:一棵含有n个节点的红黑树的高度至多为2log(n+1).

反着证明这个结论:对于高度为h的红黑树,它的包含的内节点个数至少为 2^{h/2}-1个,因为bh(x)>=h/2,

所以只要证明 它包含的内节点的个数至少为2^bh(x)-1个。

对红黑树的高度用数学归纳法证明,对于h=0,则内节点个数是0显然成立,对于节点x,其黑高度为bh(x),则其左右子树

的黑高度为 bh(x) 或者 bh(x)-1,但是高度减少至少1,因此由归纳假设知其内节点至少为 2^{bh(x)-1}个,从而总的内节点

至少为 2(2^{bh(x)-1}-1=2^{bh(x)}-1个. 结论得证。

由定理知道,红黑树的插入和删除在不考虑恢复的情况下其复杂度是 O(log(n))的。

一、红黑树的插入

第一步还是按照二叉查找树的方式插入新节点,插入后考虑节点颜色要满足红黑树的5条性质。

如果插入的节点是黑色,则一定会违反性质5,因此初始时将节点颜色赋成红色。

(1)性质1自然成立。

(2)为满足性质2,我们在每插入节点操作的最后将根节点赋成黑色。

(3)性质3没有问题。

(4)性质4单独考虑。

(5)性质5自然成立。

对于性质4的破坏,我们容易知道其新插入节点的父节点肯定是红色,其祖父节点必然为黑色。

则总共可以分为以下三种情况:

RB1

RB23

以上三种情况经过颜色调整和旋转后均可恢复局部性质4,对其他性质的破坏我们只需要考虑性质5和4.

对于性质5,只要考虑其每个子树到这个局部子树根节点的黑节点个数有无改变,容易看出性质5是保持的。

第二三种情况不会破坏性质4,唯有第一种情况可能破坏性质4,因此我们只要将新的节点放成其子树的

根继续向上调整即可。

二、红黑树的删除

删除过程相对于插入较复杂。

第一步仍然是按照二叉查找树的方式删除节点,按照实际被删除的节点分为两种情况:

(1)被删节点是红色,这将不影响红黑树的性质保持,无需后续工作

(2)被删节点是黑色,这首先会破坏红黑树的性质5,必须做调整。

考虑第二种情况,此时被删节点y的位置会被它的一个儿子节点x代替,此时我们不管x是否为外部节点都一视同仁。

由于y是黑色,所以删除y的同时也就删掉了该路径上的一个黑色,首先无条件将这个黑色赋给x,那么x就

具有双重颜色 ,红黑或者双重黑色。此时红黑树的所有性质得到保持,除了性质(1)和(3)。

如果x原本是红色则性质(3)自然成立,则将x改为黑色性质(1)就成立,算法结束。

下面仅仅考虑x为原本是黑色的情况即可。

在这种情况下,x此时应该具有双重黑色,算法的过程就是将这多出的一重黑色向上移动,直到遇到红节点或者根节点。

具体分为以下四种情况:(下面针对x是左儿子的情况讨论,右儿子对称)

(1)x的兄弟w是红色(想办法将其变为黑色)

由于w是红色,因此其儿子节点和父节点必为黑色,只要将w和其父节点颜色对换,在进行一次左旋转,便将w的左儿子

放到了x的兄弟节点上,x的兄弟节点变成了黑色,且红黑性质不变。

RBdelete1

(2)x的兄弟节点w是黑色的,而且w的两个孩子都是黑色的,此时可以将x的一重黑色和w的黑色同时去掉,而转加给

他们的父节点上,因此此时父节点具有双重颜色了。这一重黑色节点上移。

RBdelete2

(3)x的兄弟节点w是黑色的,而且w的左孩子红色,右孩子黑色,此时通过交换w和其左孩子颜色并进行一次右旋转可

转换成第四种情况。

RBdelete3

(4)x的兄弟节点w是黑色的,而且w的有孩子是红色的。这种情况下,做一次左旋,w就处于根的位置,将w保持原来的

根的位置的颜色,同时将w的两个新的儿子节点的颜色变为黑色,去掉x的一重黑色。

RBdelete4

分享到:
评论

相关推荐

    红黑树原理详解

    红黑树原理详解 红黑树原理详解 红黑树原理详解 红黑树原理详解

    红黑树的插入详细图解,直接拿下红黑树

    红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)...

    红黑树代码

    红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树...

    Linux内核红黑树封装的通用红黑树

    通用红黑树 说明: 用Linux内核红黑树封装的一个通用型的红黑树 如何使用该红黑树: 见rbtest1.c和rbtest2.c 直接make生成rbtest1和rbtest2 作者:rcyh 日期:2011年7月21日 ---------------------------------...

    红黑树C++代码实现

    描述: 实现红黑树、二叉搜索树相关算法:插入(红黑树涉及树的调整:左旋右旋等),删除,搜索(指定Key值节点)。 另外,红黑树实现计算树黑高的算法。 1).插入测试,输入 8,11,17,15,6,1,22,25,27,...

    红黑树的c实现源码与教程

    红黑树的c实现源码与剖析 原作者:那谁 源码剖析作者:July ===================== July说明: 由于原来的程序没有任何一行注释,我把它深入剖析,并一行一行的添加了注释, 详情请参见此文: 教你彻底实现红黑树:...

    红黑树算法试验完全实现(花1天时间写的算法作业)

    描述: 实现红黑树、二叉搜索树相关算法:插入(红黑树涉及树的调整:左旋、右旋等),删除,搜索(指定Key值节点)。 另外,红黑树实现计算树黑高的算法。 1).插入测试,输入 8,11,17,15,6,1,22,25,27...

    算法实现及性能比较与红黑树

    插入测试,输入 8,11,17,15,6,1,22,25,27,建立红黑树,按照 红黑树信息输出方式 输出整棵红黑树以及黑高。 2).删除测试,删除1)中红黑树中Key=15的节点,按照 红黑树信息输出方式 输出调整后的整棵红黑树...

    红黑树和AVL树的实现

    红黑树和AVL树的代码实现,并显示树的形状,同时红黑树还可以输出个路径以及黑高度

    红黑树-动态演示生成红黑树

    红黑树算法,随机产生数字,动态生成红黑树,可用于演示。

    红黑树的插入与删除_详细整理资料

    红黑树的插入与删除_详细整理资料

    红黑树算法C语言实现

    实验1:实现红黑树的基本算法, 对n的取值分别为 12、24、36、48、60,随机生成n 个互异的正整数(K1, K2, K3, ……, Kn)作为节点的关键字,向一棵初始空的红黑树中依次插入这n 个节点,统计算法运行所需时间 ,画...

    红黑树及其绘制

    红黑树是重要的数据结构,而其操作又很复杂,如果能够可视化地展示插入与删除过程,则学习起来会容易得多。 为了学习它们,我翻译以下文章(论文)并实现了相应算法,并放到网络上,与说中文的程序爱好者共同进步。...

    红黑树.源码

    红黑树

    红黑树-使用C++实现-简单练习

    在学习c++的过程中实现的红黑树,功能比较完善,无优化..

    红黑树算法的c实现

    红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树红黑树

    (002)HashMap$TreeNode之往红黑树添加元素-putTreeVal方法.docx

    HashMap之往红黑树添加元素-putTreeVal方法源码解读:当要put的元素所在数组索引位置已存在元素,且是红黑树类型时,就会调用putTreeVal方法添加元素到红黑树上,具体操作步骤如下: 1. 从根节点开始,到左右子树,...

    红黑树_ C++模板实现

    详细的红黑树C++模板实现,调试后运行正确。 template class RBTree { private: static node<T> *nil;//哨兵,静态成员,被整个RBTree类所共有 node<T> *root; RBTree(const RBTree&);//禁止复制构造 RBTree ...

    29.红黑树_2.wmv(目前数据结构最好的视频,共42集,需要哪一集的知识自己下,一集3积分)

    26红黑树 27红黑树_0 28红黑树_1 29红黑树_2 30红黑树_3 31红黑树_4 32红黑树_5 33红黑树_6 34堆 35堆排序 36哈希与映射的概述 37B树有什么用 38B树的概念 39图_邻接矩阵 40图_邻接表 41图_DFS 42图_BFS

Global site tag (gtag.js) - Google Analytics