`
cloudtech
  • 浏览: 4607971 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

红黑树

 
阅读更多

红黑树
一棵红黑树是指一棵满足下述性质的二叉搜索树(BST, binary search tree):
1. 每个结点或者为黑色或者为红色。
2. 根结点为黑色。
3. 每个叶结点(NIL)都是黑色的。
4. 如果一个结点是红色的,那么它的两个子节点都是黑色的(也就是说,不能有两个相邻的红色结点)。
5. 对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同。
红黑树的每个节点上的属性除了有一个key、3个指针:parent、lchild、rchild以外,还多了一个属性:color。它只能是两种颜色:红或黑。
节点x的黑高度:从某个节点x到达一个叶结点的任意一条路径上包含的黑色结点(包括叶结点)数量。用bh(x)表示。另外规定叶结点的黑高度为0。
定理:一棵含有n个内结点的红黑树的树高至多为2log(n+1)
证明:先证以某一节点x为根的子树中至少包含2^bh(x) - 1个内节点。用归纳法:
(1)x的高度为0,则x为一叶节点,以x为根的子树中包含2^bh(x) - 1 = 2^0 - 1 = 0;
(2)考虑一个高度为正值的节点x,它是个内节点,且有两个子女,每个子女根据其自身的颜色是红或黑而有黑高度bh(x)或bh(x) - 1,由归纳假设,每个子女至少包含2^(bh(x) - 1) - 1个内节点。所以,以节点x为根的子树中至少包含(2^(bh(x) - 1) - 1) + (2^(bh(x) - 1) - 1) + 1 = 2^bh(x) - 1。命题得证。
设h为树的高度,根据性质4,从根到叶节点(不包括根)的任一条简单路径上,至少有一半的节点必是黑的。从而,根的黑高度至少为h / 2;故有 n>= 2^(h / 2) - 1 有lg(n + 1) >= h / 2 或(h <= 2lg(n +1))。
所以,命题得证。
由这个定理可知,动态集合操作Search, Minimum, Maximum, Successor, Predecessor可用红黑树在O(lg n)时间内实现。
但是操作TreeInsert、TreeDelete,有可能破坏了红黑树的性质。所以我们要做一些操作来把整棵树修补好。
节点的LeftRotate和RightRotate操作,所谓LeftRotate(x)就是把节点x向左下方向移动一格,然后让x原来的右子节点代替它的位置。而RightRotate当然就是把LeftRotate左、右互反一下。如下图:

注意,LeftRotate(x)后,x的右子树变成了原来y的左子树,RightRotate反之。思考一下,这样一次变换后,仍然满足二叉搜索树的性质。在红黑树的插入、删除中,要用到很多LeftRotate和RightRotate操作。
一、插入
首先是二叉搜索树的插入步骤,把新节点z插入到某一个叶节点的位置上,把z的颜色设成红色。如果z的父节点也是红色,我们要执行下面一个迭代的过程,称为InsertFixup,来修补这棵红黑树。
在InsertFixup中,每一次迭代的开始,指针z一定都指向一个红色的节点。如果z->p是黑色,那我们就大功告成了;如果z->p是红色,显然这就违返了红黑的树性质,那么我们要想办法把z或者z->p变成黑色,但这要建立在不破坏红黑树的其他性质的基础上。
在每一次迭代中,我们可能遇到以下三种情况。
Case 1: z's uncle y is red

Case 2: z's uncle y is black and z is a right child
Case 3: z's uncle y is black and z is a left child

反复迭代,直到某一次迭代开始时z->p为黑色而告终,也就是当遇到Case 3后,做完它而告终。
二、删除
红黑树中删除一个节点z的方法也是首先按部就班二叉搜索树的过程。如果删除的节点是黑色的,那么红黑树的性质就被破坏了。这时我们就要执行一个称为DeleteFixup的过程,来修补这棵树。
一个节点被删除之后,一定有一个它的子节点代替了它的位置。我们就设指针x指向这个代替位置的节点。显然,如果x是红色的,那么我们只要把它设成黑色,它所在的路径上就重新多出了一个黑色节点,那么红黑树的性质就满足了。然而,如果x是黑色的,那我们就要假想x上背负了2个单位的黑色。那么红黑树的性质也同样不破坏,但是我们要找到某一个红色的节点,把x上“超载”的这1个单位的黑色丢给它,这样才算完成.deleteFixup做的就是这个工作。
DeleteFixup同样是一个循环迭代的过程。每一次迭代开始时,如果指针x指向一个红色节点,把它设成黑色即告终。如果x黑色,那么我们就会面对以下4种情况。
Case 1: x's sibling w is red

Case 2: x's sibling w is black, and both of w's children are black

Case 3: x's sibling w is black, w's left child is red, and w's right child is black

Case 4: x's sibling w is black, and w's right child is red

Case 4 occurs when node x's sibling w is black and w's right child is red. By making some color changes and performing a left rotation on p[x], we can remove the extra black on x, making it singly black, without violating any of the red-black properties. Setting x to be the root causes the while loop to terminate when it tests the loop condition.

分享到:
评论

相关推荐

    红黑树原理详解

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

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

    红黑树(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&lt;T&gt; *nil;//哨兵,静态成员,被整个RBTree类所共有 node&lt;T&gt; *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