一、红黑树的定义

【百度百科】红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。

红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

二、红黑树的特点

  1. 每个结点要么是红的要么是黑的。(红或黑)
  2. 根结点是黑的。(根黑)
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 (叶黑)
  4. 如果一个结点是红的,那么它的两个儿子都是黑的,不存在两个连续的红色节点。(红子黑)
  5. 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

这五条性质约束了红黑树,才能保证红黑树的自平衡,最长路径不超过最短路径的两倍。可以通过数学证明来证明,红黑树可以将查找删除维持在对数时间内。 
当我们进行插入或者删除操作时,就会对平衡造成破坏,这时候需要对树进行调整,从而重新达到平衡。所作的一切操作都是为了调整树使之符合这五条性质。

三、红黑树的操作方式

继续来深刻理解这个很重要,在插入和删除时,红黑树的结构可能会出现不平衡的情况,此时,红-黑树主要通过三种方式对平衡进行修正,改变节点颜色、左旋和右旋。

本文不对具体的插入和删除步骤进行推导了,因为这样的文章很多,我们只讲原理,这样可能会更有意思一点。

四、红黑树的应用

红黑树的应用比较广泛,主要是用它来存储有序的数据,效率非常之高。

红黑树的查找、插入和删除时间复杂度都为O(log2N),额外的开销是每个节点的存储空间都稍微增加了一点,因为一个存储红黑树节点的颜色变量。插入和删除的时间要增加一个常数因子,因为要进行旋转,平均一次插入大约需要一次旋转,因此插入的时间复杂度还是O(log2N),(时间复杂度的计算要省略常数),但实际上比普通的二叉树是要慢的。

大多数应用中,查找的次数比插入和删除的次数多,所以应用红黑树取代普通的二叉搜索树总体上不会有太多的时间开销。而且红黑树的优点是对于有序数据的操作不会慢到O(N)的时间复杂度。

例如,Java集合中的TreeSet和TreeMap以及JDK1.8以后的HashMap在当个节点中链表长度大于8时都会用到。C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。

五、总结

  1. 红黑树的实现其实是一个2、3、4树,只是将双节点或者三节点用红色进行了标示,如果你将红色节点放到和它父元素相同的高度,并把它和父元素看做是一个元素,你就会发现,变成了一个高度为lgN的二叉树,这个2.3.4树对红黑树很有启发意义。
  2. 上面的步骤其实可以不用死记硬背,是可以推导出来的,因为我们是把一个平衡但通过插入或者删除破坏了平衡的红黑树再次平衡,同过旋转让位,改变红黑颜色,使之符合那五条基本性质。比如遇到删除操作情况四的时候,我们可以把那个删除元素去除,发现左边比右边少一个黑元素,这个时候,怎么办,我们发现兄弟节点的子元素有一个红元素,操作这个不会影响那五条性质,所以我们通过变换颜色,旋转,即可让左右两边的的黑色数目一样。
  3. 旋转操作的目的是出让一个元素到另外的地方并且符合二叉树左小右大的性质,交换颜色的目的是为了保持红黑树的那五条性质。
  4. 要时刻记得 ,一切的操作都是为了保持那五条性质。
  5. 一定要尝试着自己推导一下插入删除规则,不然经常忘,是睡一觉起来再看就有点懵逼的那种忘。

我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://www.cnblogs.com/ysocean/p/8004211.html
  2. https://blog.csdn.net/wannuoge4766/article/details/83998377
  3. https://blog.csdn.net/Sun_TTTT/article/details/65445754
  4. https://www.cnblogs.com/xuxinstyle/p/9556998.html
  5. https://www.h3399.cn/201809/619925.html

程序员的进阶课-架构师之路(11)-最容易理解的红黑树相关推荐

  1. 程序员的进阶课-架构师之路(17)-堆

    我们来介绍另外一种数据结构-堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的"堆"是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O ...

  2. 程序员的进阶课-架构师之路(7)-树的概念

    接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  3. 树复制替换id_程序员的进阶课-架构师之路(12)-2-3-4树

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  4. 程序员的进阶课-架构师之路(12)-2-3-4树

    一.2-3-4树的定义 2-3-4树就是一种4阶的多叉树,它像红黑树一样是平衡树,可以保证在O(lgn)的时间内完成查找.插入和删除操作,容易实现,但是效率比红黑树稍差. 2-3-4树每个节点最多有四 ...

  5. 程序员的进阶课-架构师之路(9)-平衡二叉树(AVL树)

    一.平衡二叉树的定义 对一棵查找树(search tree)进行查询/新增/删除 等动作, 所花的时间与树的高度h 成比例, 并不与树的容量 n 成比例.如果可以让树维持矮矮胖胖的好身材, 也就是让h ...

  6. 根据id获取多维数组路径_程序员的进阶课-架构师之路(2)-数组

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  7. 程序员的进阶课-架构师之路(18)-图

    一.图的定义 在计算机科学中,图(Graphics)是由顶点集合(Vertex)及顶点间的关系(边)集合(Edge)组成的一种数据结构,这些顶点通过一系列边结对(连接).顶点用圆圈表示,边就是这些圆圈 ...

  8. 程序员的进阶课-架构师之路(5)-队列

    一.队列的定义 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操 ...

  9. 程序员的进阶课-架构师之路(4)-栈

    一.栈的定义 [百度百科]栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据 ...

最新文章

  1. 三、const常量声明方式
  2. java 模拟时钟_java模拟时钟
  3. linux中创建本地yum库,轻松安装Linux软件
  4. solrCloud源码分析之CloudSolrClient
  5. C++ STL vector(向量)
  6. react 动态路 嵌套动子路由_2020年,我是如何从一名Vueer转岗到React阵营
  7. java integer最大值_五分钟学会java中的基础类型封装类
  8. 自定义函数删除字母C语言,[编程入门]自定义函数之字符提取-题解(C语言代码)...
  9. 利用Python实现定时发送邮件,实现一款营销工具
  10. 工作10以上老程序员都去哪了?作为新时代的程序员我们该何去何从
  11. JAVA 创建学生类
  12. android高德地图选取坐标点,【API】高德地图API JS实现获取坐标和回显点标记(示例代码)...
  13. 数学建模笔记(七):综合评价模型
  14. 2038:最大数位置(题目来源于信息奥赛一本通官网)
  15. 万字长文,图文并茂的给你讲清SpringBoot注解,自动装配原理!
  16. JAVA中native方法调用C语言实现学习
  17. 亚马逊雨林大火为何上不了热搜?我们都被某些媒体给忽悠了!
  18. 3 - 分布式系统的流量防卫兵:Sentinel
  19. 【Java】继承——成员变量的私有化(修饰符super进行访问)
  20. 我的Chrome浏览器插件

热门文章

  1. linux有关信号的FAQ
  2. IT永远也不可能做到整体外包,这句话是我说的。。。
  3. DB2数据库备份恢复
  4. 炫天塔罗占卜结果......
  5. spark KafkaRDD的理解
  6. Build the backend services needed for a WebRTC app
  7. MySQL的MVCC底层原理二
  8. 天津科技大学中外合作办学计算机科学怎么样,天津科技大学计算机类(中外合作办学)(计算机科学与技术(信息处理专业2016年在安徽理科高考录取最低分数线...
  9. 设计模式---创建型模式
  10. Go 除了泛型外最值得期待的新功能,模糊测试