DataStructuresAndAlogorithm--红黑树
简介
为了理解红黑树(red-black tree)是什么,首先需要知道二叉树。
定义1:二叉树是结点的有限集合,该集合或者为空集,或者是由一个根和两棵互不相交的,称为该根的左子树和右子树的二叉树组成。
但是为了解决实际问题,往往需要对数据作一定的排序,这样才能更快速的找到所要的数据。基于此,我们需要了解下二叉搜索树(Binary Search Tree, BST)。
定义2:设结点由关键字值表征,假定所有结点的关键字值各不相同,二叉搜索树或者谁一棵空二叉树,或者是具有下列性质的二叉树:
1)若左子树不空,则左子树上所有结点的关键字值均小于根结点的关键字值
2)若右子树不空,则右子树上所有结点的关键字值均大于根结点的关键字值
3)左,右子树也分别是二叉搜索树
然而,某些极端情况下,二叉搜索树可能会变成只有左子树或只有右子树等这些极端情况,相当于树退化成了一个链表,为了防止这种退化,我们需要了解些二叉平衡树。
定义3:二叉平衡树又成AVL树(G.M.Adel'son-Vel'skii和E.M.Landis),它或者是一棵空二叉树,或者是具有下列性质的二叉树:
)其根的左,右子树高度之差的绝对值不超过1
)其根的左,右子树都是二叉平衡树
然而,这还不是非常完美,因为二叉平衡树的性质1导致了其为了维护其平衡性,需要作过多的旋转调整操作,基于此,红黑树这个弱化的二叉平衡树横空出世。
红黑树在每个结点上增加了一个存储位来表示结点的颜色,可以是RED或BLACK。通过对任何一条根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因为是近似平衡的。红黑树可以保证在最坏情况下基本动态集合操作的时间复杂度为O(logn)。
一棵红黑树是满足下面红黑性质的二叉搜索树:
)每个结点的或是红色的,或是黑色的
)根结点是黑色的
)每个叶结点(NIL)是黑色的
)如果一个结点是红色的,则它的两个子结点都是黑色的
)对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
DataStructuresAndAlogorithm--红黑树的更多相关文章
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- jdk源码分析红黑树——插入篇
红黑树是自平衡的排序树,自平衡的优点是减少遍历的节点,所以效率会高.如果是非平衡的二叉树,当顺序或逆序插入的时候,查找动作很可能会遍历n个节点 红黑树的规则很容易理解,但是维护这个规则难. 一.规则 ...
- 谈c++ pb_ds库(二) 红黑树大法好
厉害了,没想到翻翻pb_ds库看到这么多好东西,封装好的.现成的splay.红黑树.avl... 即使不能在考场上使用也可以用来对拍哦 声明/头文件 #include <ext/pb_ds/tr ...
- 定时器管理:nginx的红黑树和libevent的堆
libevent 发生超时后, while循环一次从堆顶del timer——直到最新调整的最小堆顶不是超时事件为止,(实际是del event),但是会稍后把这个timeout的 event放到ac ...
- 从2-3-4树到红黑树(下) Java与C的实现
欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 相关博客: 从2-3-4树到红黑树(上) 从2-3-4树到红黑树(中) 1. 实现技 ...
- 红黑树/B+树/AVL树
RB Tree 红黑树 :http://blog.csdn.net/very_2/article/details/5722682 Nginx的RBTree实现 :http://blog.csdn ...
- 论AVL树与红黑树
首先讲解一下AVL树: 例如,我们要输入这样一串数字,10,9,8,7,15,20这样一串数字来建立AVL树 1,首先输入10,得到一个根结点10 2,然后输入9, 得到10这个根结点一个左孩子结点9 ...
- DataStructure——红黑树学习笔记
1.前言 本文伪码和解释参考: http://blog.csdn.net/v_JULY_v/article/details/6105630 C实现的源码本文未贴出,请见: http://blog.cs ...
- 红黑树(Red-Black tree)
红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗自平衡的排序二叉树.我们知道一颗基本的二叉树他们都需要满足一个基本性质–即树中的任何节点的值大于它的左子节点,且小 ...
- map,hash_map, hash_table, 红黑树 的原理和使用
在刷算法题的时候总是碰到好多题,号称可以用hash table来解题.然后就蒙圈了. 1.首先,map和hash_map的区别和使用: (1)map底层用红黑树实现,hash_map底层用hash_t ...
随机推荐
- redis api-zset
- quartz spring 实现动态定时任务
在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间.频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quar ...
- leetcode200 Number of Islands
""" Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. ...
- zigbee CC2530首选方案模组:TZU06A1
模块特点 微型24-pin 邮票式SMT 封装 提供U.FL 接口,用于外接SMA 天线 小尺寸封装:16mm*20mm*3.7mm 通过欧盟CE0168.欧盟ROHS 认证 基于8051 单片机架构 ...
- Windows系统查看端口被那些进程使用
Windows系统查看端口被那些进程使用注:当前Windows为虚拟机环境1. 打开命令提示符:开始-运行-cmd2. 列出使用端口的PID: netstat -abno -a 显示所有连接和侦听端口 ...
- java实现下划线转驼峰
废话少说,直接上代码 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Temp { publi ...
- C++中数字与字符串之间的转换 scanf string总结(复习必读)
1 string的scanf读入操作 C++里面控制台输入直接使用cin操作就可以了:或者getline(istringstream,string); 字符和数字加减就是字符的ASCII码和数字直接加 ...
- 留学生Essay写作清晰简洁8大原则
英语Essay写作中国留学生需要掌握的一个技能,一篇文笔简洁优雅的Essay对于提高分数会有很大帮助.但目前的情况是,很多人并没有受过专门的学术Essay写作训练,在写Essay时经常会出现各种各样的 ...
- BottomTabBar 套用 recycleview出错问题
原来不是用这个框架的 是一个不知名的github开源类 开始感觉很不错 后来套用recycleview就出错应该是碎片关系没处理好 ,后来用bottomtabbar 他的傻逼思想深深撼动了我, ...
- 吴裕雄--天生自然java开发常用类库学习笔记:对象克隆技术
class Person implements Cloneable{ // 实现Cloneable接口表示可以被克隆 private String name ; public Person(Strin ...