红黑树简单总结

 

红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1. 节点是红色或黑色。

性质2. 根是黑色。

性质3. 所有叶子都是黑色(叶子是NIL节点)。

性质4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)

性质5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。

插入旋转

令插入的新节点为N,N的父节点为P,祖父节点为G,叔父节点为U,插入时N为红色,当P为黑色时没问题,插入旋转的原因是红红冲突,即N和P都为红色,旋转的关键在于U的颜色和N在左子树还右子树;

情形(1),U=红,令(P,U)=(黑,黑),G=红,结束,此时U在左子树or右子树无所谓;

情形(2),U=黑,N在左子树,右旋转即可,P=黑,G=红;结束

情形(3),U=黑,N在右子树,对P子树执行左旋转,变为情形(2);

插入操作最多旋转二次,是在第二种情形下;

综上所述,插入旋转的关键在叔父节点的颜色,和插入节点的左右位置;

删除旋转

如果需要删除的节点有两个儿子,那么问题可以被转化成删除另一个只有一个儿子的节点的问题,当待删除节点和孩子节点有一个为红色,易解;难点在于待删除和儿子节点都为黑色,删除后用孩子节点代替,这课子树高度减一,令被代替后的的节点为N,父节点为P,兄弟节点为S,S的左右孩子节点为SL和SR,此时已知h(N)=h-1,h(S)=h,即P的左子树高度比右子树少一,N一定为黑色,N为当前节点,由于P的左右黑高不平衡需要根据以下情况旋转:

情形(1) 当(P, S, SL,SR)= (黑,红,*,*)时,这时,由于红黑树的的固有性质,后两个*也一定为黑。对当前树进行左旋如下图,此时P子树仍不平衡,但问题转为情形(3)(4)(5),还是以N为当前节点;

情形(2) 当(P, S, SL,SR)=(黑,黑,黑,黑)时,令S=红,P子树平衡,但高度减一,以P为当前节点向上递归;

情形(3) 当(P, S, SL,SR)=(红,黑,黑,黑)时,令P=黑,S=红;平衡结束;

注:剩下的情形(黑,黑,红,黑)、(黑,黑,黑,红)/(红,黑,红,黑)、(红,黑,黑,红)归结为(*,黑,红,黑)和(*,黑,黑,红);

情形(4) 当(P, S, SL,SR)=(*,黑,红,黑)时,在S子树上执行右旋转,转为情形(5),下图未画出N和P;

情形(5) 当(P, S, SL,SR)=(*,黑,黑,红)时,执行左旋转,完毕

删除操作最多旋转三次,旋转序列是(1)(4)(5);

红黑树的删除旋转到此结束,删除旋转关键是看(P,S,SL,SR)的各种组合;

参考:http://zh.wikipedia.org/wiki/红黑树

时间: 2024-10-13 20:31:55

红黑树简单总结的相关文章

查找(一)史上最简单清晰的红黑树解说

查找(一) 我们使用符号表这个词来描写叙述一张抽象的表格.我们会将信息(值)存储在当中,然后依照指定的键来搜索并获取这些信息.键和值的详细意义取决于不同的应用. 符号表中可能会保存非常多键和非常多信息,因此实现一张高效的符号表也是一项非常有挑战性的任务. 我们会用三种经典的数据类型来实现高效的符号表:二叉查找数.红黑树.散列表. 二分查找 我们使用有序数组存储键,经典的二分查找可以依据数组的索引大大降低每次查找所需的比較次数. 在查找时,我们先将被查找的键和子数组的中间键比較.假设被查找的键小于

【转载】完整简单的红黑树算法

原文: 完整简单的红黑树算法 最近组内定个规矩,每周分享一个算法,上周是第一周,分享的是红黑树,下面是自己学习总结的,感觉网上的都不是特别清楚,要么是写的特别复杂,没有一点条理. 一.红黑树性质 1.每个结点要么是红的要么是黑的 2.根结点是黑的 3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的 4.如果一个结点是红的,那么它的两个儿子都是黑的 5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点 总结:平衡状态下红黑树要么单支黑-红,要么有两个子节

完整简单的红黑树算法

最近组内定个规矩,每周分享一个算法,上周是第一周,分享的是红黑树,下面是自己学习总结的,感觉网上的都不是特别清楚,要么是写的特别复杂,没有一点条理. 一.红黑树性质 1.每个结点要么是红的要么是黑的 2.根结点是黑的 3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的 4.如果一个结点是红的,那么它的两个儿子都是黑的 5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点 总结:平衡状态下红黑树要么单支黑-红,要么有两个子节点 二.复杂度 O(lgn)

简单清晰的红黑树

查找(一) 我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息.键和值的具体意义取决于不同的应用. 符号表中可能会保存很多键和很多信息,因此实现一张高效的符号表也是一项很有挑战性的任务. 我们会用三种经典的数据类型来实现高效的符号表:二叉查找数.红黑树.散列表. 二分查找 我们使用有序数组存储键,经典的二分查找能够根据数组的索引大大减少每次查找所需的比较次数. 在查找时,我们先将被查找的键和子数组的中间键比较.如果被查找的键小于中间键,我

简单聊聊红黑树(Red Black Tree)

? 前言 众所周知,红黑树是非常经典,也很非常重要的数据结构,自从1972年被发明以来,因为其稳定高效的特性,40多年的时间里,红黑树一直应用在许多系统组件和基础类库中,默默无闻的为我们提供服务,身边有很多同学经常问红黑树是怎么实现的,所以在这里想写一篇文章简单和大家聊聊下红黑树 小编看过很多讲红黑树的文章,都不是很容易懂,主要也是因为完整的红黑树很复杂,想通过一篇文章来说清楚实在很难,所以在这篇文章中我想尽量用通俗口语化的语言,再结合 Robert Sedgewick 在<算法>中的改进的版

10.STL简单红黑树的实现

1.红黑树简介 二叉搜索树能够提供对数的元素插入和访问.二叉搜索树的规则是:任何节点的键值一定大于其左子树的每一个节点值,并小于右子树的每一个节点值. 常见的二叉搜索树有AVL-tree.RB-tree(红黑树).红黑树具有极佳的增.删.查性能,故我们选择红黑树作为关联式容器(associative containers)的底层结构. 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色.在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 1.      节点是

C++实现一个简单的红黑树(RB_TREE)

红黑树遵守的规则:一头(根)一脚(叶子节点)黑(黑色),黑同(从任意节点开始至NULL结点的黑色节点的个数相等)红不连(红色节点不能相连) 以下是红黑树的插入和旋转函数的简易实现: #include <iostream> #include <assert.h> #include <string.h> using namespace std; typedef int Type; typedef enum{RED=0, BLACK}Color; //节点的颜色 typede

B树、B+树、红黑树、AVL树比较

B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树. B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计. B树相对于红黑树的区别 在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况.为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写.磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读

红黑树之删除节点

红黑树之删除节点 上一篇文章中讲了如何向红黑树中添加节点,也顺便创建了一棵红黑树.今天写写怎样从红黑树中删除节点. 相比于添加节点,删除节点要复杂的多.不过我们慢慢梳理,还是能够弄明白的. 回顾一下红黑树的性质 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色.在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色. 根节点是黑色. 每个叶节点(这里的叶节点是指NULL节点,在<算法导论>中这个节点叫哨兵节点,除了颜色属性外,其他属性值都为任