红黑树学习

红黑树是工程中用的比较多的一个数据结构,它的优点是查找的复杂度是O(lgN), 而且红黑树会在插入

数据的时候保持平衡,抑制复杂度的暴涨。虽然它没有hashtable那样高效,但是不用事先规划并分配空间。那么它是怎么做到的呢?

下面是它的特性:

1.红黑树由红色和黑色的元素构成(着色)

2.红色节点没有红色的子节点(红色与红色是宿敌)

3.所有从根节点到叶子节点的黑色节点数量相等(左右平衡)。

可以推出:

1根节点是黑色的。

2.红色节点的两个子节点都是黑色的

插入操作

数据是怎么插入呢?这里忘了提它的一个重要的性质,中间的数据总比左边的大, 比右边的小。

这样可以保证查找时沿着一条路下去找就可以了。

这里举个例子:

插入步骤

1.比当前键值小的,往左移,比当前键值大的,往右移动。找适当位置插入

2.颜色的决定

——如果把它搞成黑色,那么就比较麻烦了,因为所有从根节点到叶子节点的黑色节点数量相等

这样一来会比较难以修复。

——所以搞成红色

3.红色的点插入后会导致两个红色的点连续的情况,违反了红色节点没有红色的子节点的条件。

所以我们要在插入后进行修复。这是红黑树比较麻烦的点。

注意点

修复时,空的子节点也要带上一起修复(被认为是黑色)!

修复时,把红色的节点往上拉,可以减少冲突!

2-3树

关于红黑树的操作,可以先看看2-3树是怎么操作的,这样可以容易理解红黑树的操作。

具体可以看看算法这本书,作者是(Robert Sedgewick 和Kevin Wayne),英文原版424页。

这里是其中的一张图(重画),可以看到,单个key的设计可以用多key的节点演化而来。

原书446页有这样一句话,可以说明红黑树是从2-3树演化而来的。所以看懂了2-3树之后,红黑树也就容易理解了。

The basic idea behind red-black BSTs is to encode 2-3 trees by starting with standard
BSTs (which are made up of 2-nodes) and adding extra information to encode 3-nodes.

  

红黑树这样的形态,即获得了BST的简易性,又获得了2-3树的平衡性,红黑树是2-3树的一种特殊的形态。

2-3树到红黑树的转换:

这里的红黑点实际上是红黑的链接,图中红色粗链接表明红线下面的节点是红色的。

红黑树操作

左右两图进行了rotate操作(左旋和右旋),但是它们是等价的,因为数据的顺序是不变的(BCDEF)。

只是将红色链接倾斜了。

 

红黑树插入

第一个点是黑色的。

插入第二个点,一定在它的左边或者右边。在左边的时候直接在左边插入一个红点就行了。

在右边的时候插入一个红点,并且做左旋操作。在这里,作者基本上都尽量将节点左旋。

这是总结出的做法:

left rotate, right rotate, and color ?ip

总的来说,先尽量将红色链接放到左边,当连续有两个左边的红色链接时,做右旋,使得它左右两边都有红色链接。最后将这个两个链接变成黑色。

红黑树的删除

删除会比较麻烦一点,但是如果将它看成2-3树就好多了:

举个例子,若要将A删除,只要将ABC合并成一组再删除,这样就不用考虑链接的处理了。

这里书上都有讲。

参考文献:

Algorithms - fourth edition

http://www.cs.usfca.edu/~galles/visualization/RedBlack.html

时间: 2024-10-03 13:47:31

红黑树学习的相关文章

算法导论 红黑树 学习 旋转(二)

学习算法 还是建议看看算法导论 算法导论第三版 如果不看数学推导 仅看伪代码 难度还是适中 本系列只是记录我的学习心得 和伪代码转化代码的过程 深入学习 还是建议大家看看算法书籍 教程更加系统. 本文参考算法导论第13章节 红黑树 代码由本人写成 转载请标明出处 红黑树是一个带颜色的二叉树 有以下5点性能 1 每个节点或者红色或者黑色 2 根节点黑色 3 每个叶子节点(nil)为黑色 4 如果一个节点是红色的则它的两个子节点都是黑色 5 每个节点 该节点到子孙节点的路径上 黑色节点数目相同 如图

算法导论 红黑树 学习 删除(四)

版权声明:本文为博主原创文章,未经博主允许不得转载.技术博客 http://blog.csdn.net/stecdeng 技术交流群 群号码:324164944 欢迎c c++ windows驱动爱好者 服务器程序员沟通交流 学习算法 还是建议看看算法导论 算法导论第三版 如果不看数学推导 仅看伪代码 难度还是适中 本系列只是记录我的学习心得 和伪代码转化代码的过程 深入学习 还是建议大家看看算法书籍 教程更加系统. 本文参考算法导论第13章节 红黑树 代码由本人写成 转载请标明出处 先看看不做

红黑树学习资料总结

关于红黑树的插入:红黑树并没有我们想象的那么难(上) 关于红黑树的删除:红黑树插入删除 关于红黑树的源码剖析:红黑树C源码实现与剖析

红黑树 学习笔记

  性质: 节点非黑即红 根和叶子节点是黑(这里说的叶子节点指填充后的树的叶子节点,NIL节点) 红节点的父节点是黑节点 任意一个节点到以他为根的叶子节点所经过的黑节点数目(不包括自身,但包括叶子节点)的个数是一样. 红黑树可以在O(lgn)时间内完成查询搜索操作,另插入操作需要最多2次旋转,删除操作需要最多3次旋转.

数据结构 - 红黑树学习

红黑树 红黑树算是用的比较多,但是平时自己很少写的一种数据结构了,先看下介绍: 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组. 看~ 典型是用来实现关联数组,能想到什么数据结构呢?list map set这些容器的底层都是红黑树来实现的. 红黑树和AVL树(平衡二叉查找树) 红黑树并不是完全平衡的一棵树,所以红黑树是在平均时间(经验)上为O(log n)的复杂度,包括插入,删除和查找. 红黑树规则 所有节点都分为红色

DataStructure——红黑树学习笔记

1.前言 本文伪码和解释参考: http://blog.csdn.net/v_JULY_v/article/details/6105630 C实现的源码本文未贴出,请见: http://blog.csdn.net/v_july_v/article/details/6114226 July的博客对红黑树的分析很精彩,请见: http://blog.csdn.net/v_JULY_v/article/category/774945 本文对参考资料有所修订和补完(侵删). 2.正文 伪码中使用的符号:

红黑树学习笔记(3)-删除操作

1.设删除的节点为$z$,另外定义节点$x,y$如下: $y=\left\{\begin{matrix}z & z的左孩子或右孩子为空节点\\ Successor(z) & otherwise\end{matrix}\right.$ $x=\left\{\begin{matrix}y.left & y的左孩子不为空\\ y.right & otherwise\end{matrix}\right.$ 其中$Successor$函数的定义在这里 接下来,用$x$替换节点$y$,

算法导论学习---红黑树具体解释之插入(C语言实现)

前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜索树,它通过在每一个结点附加颜色位和路径上的一些约束条件能够保证在最坏的情况下基本动态集合操作的时间复杂度为O(nlgn).以下会总结红黑树的性质,然后分析红黑树的插入操作,并给出一份完整代码. 先给出红黑树的结点定义: #define RED 1 #define BLACK 0 ///红黑树结点定义,与普通

木马程序猿学习笔记——红黑树解析3

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 六.树的前序.中序.后序 前序遍历(根左右): 1.訪问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右): 1.中序遍历左子树 2.訪问根节点 3.中序遍历右子树 后序遍历(左右根): 1.后序遍历左子树 2.后序遍历右子树 3.訪问根节点 扩展:已知前序.中序遍历,求后序遍历? 例: 前序遍历: GDAFEMHZ 中序遍历: