数据结构与算法之美
王争
前 Google 工程师
283752 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 81 讲
基础篇 (38讲)
数据结构与算法之美
15
15
1.0x
00:00/00:00
登录|注册

25 | 红黑树(上):为什么工程中都用红黑树这种二叉树?

下一节讲解
AVL树
Splay Tree
Treap
实现复杂,可用跳表替代
适用于动态插入、删除、查找数据的场景
性能稳定
插入、删除、查找操作时间复杂度为 O(logn)
高度稳定
近似平衡
解决二叉查找树性能退化问题
红黑树的实现
其他平衡二叉查找树
为什么工程中使用红黑树
特点
平衡二叉查找树
红黑树

该思维导图由 AI 生成,仅供参考

上两节,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是 O(logn)。
不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于 log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复杂度会退化到 O(n)。我上一节说了,要解决这个复杂度退化的问题,我们需要设计一种平衡二叉查找树,也就是今天要讲的这种数据结构。
很多书籍里,但凡讲到平衡二叉查找树,就会拿红黑树作为例子。不仅如此,如果你有一定的开发经验,你会发现,在工程中,很多用到平衡二叉查找树的地方都会用红黑树。你有没有想过,为什么工程中都喜欢用红黑树,而不是其他平衡二叉查找树呢?
带着这个问题,让我们一起来学习今天的内容吧!

什么是“平衡二叉查找树”?

平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,上一节我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。
平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。最先被发明的平衡二叉查找树是AVL 树它严格符合我刚讲到的平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

红黑树是一种重要的平衡二叉查找树,用于解决二叉查找树在频繁动态更新时可能出现的性能退化问题。其定义包括根节点为黑色、叶子节点为黑色空节点、相邻节点不能同时为红色、每个节点到达叶子节点的路径包含相同数目的黑色节点等规则。红黑树的高度近似于2log2n,仅比高度平衡的AVL树的高度(log2n)多一倍,性能下降并不多。因此,红黑树被广泛应用于工程中,以提高插入、删除、查找等操作的效率。相比于AVL树,红黑树的维护平衡成本较低,使得其在工程应用中更受青睐。红黑树是一种性能稳定的平衡二叉查找树,适用于动态数据操作的场景。文章还介绍了平衡二叉查找树的概念和红黑树的定义,以及红黑树的近似平衡性质。虽然红黑树的实现较为复杂,但掌握其由来、特性、适用场景和解决问题的能力即可。文章还提到了红黑树与其他动态数据结构的对比,以及红黑树在工程中的应用和实现难度。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据结构与算法之美》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(138)

  • 最新
  • 精选
  • Smallfly
    动态数据结构的动态是什么意思? 动态是指在运行时该数据结构所占的内存会扩大或缩小。 数组是一种静态的数据结构,在创建时内存大小已经确定,不管有没有插入数据。而链表是动态的数据结构,插入数据 alloc 内存,删除数据 release 内存。 栈、队列、散列表、跳表、树都是抽象的数据结构,它们在内存中存在的形式都要依赖于数组或者链表。 如果用链表实现,很明显它们是动态的数据结构;如果用数组实现,那么在扩容的时候会创建更大内存的数组,原数组被废弃,从抽象角度看,它们仍旧是动态的。

    作者回复: 我看smallfly大牛好像对动态数据结构有些误解,可能其他同学也会有。所以,我解释一下:动态数据结构是支持动态的更新操作,里面存储的数据是时刻在变化的,通俗一点讲,它不仅仅支持查询,还支持删除、插入数据。而且,这些操作都非常高效。如果不高效,也就算不上是有效的动态数据结构了。所以,这里的红黑树算一个,支持动态的插入、删除、查找,而且效率都很高。链表、队列、栈实际上算不上,因为操作非常有限,查询效率不高。那现在你再想一下还有哪些支持动态插入、删除、查找数据并且效率都很高的的数据结构呢??

    2018-11-16
    6
    136
  • 失火的夏天
    动态数据结构有链表,栈,队列,哈希表等等。链表适合遍历的场景,插入和删除操作方便,栈和队列可以算一种特殊的链表,分别适用先进后出和先进先出的场景。哈希表适合插入和删除比较少(尽量少的扩容和缩容),查找比较多的时候。红黑树对数据要求有序,对数据增删查都有一定要求的时候。(个人看法,欢迎老师指正)

    作者回复: 👍 刚看错了。写的不错

    2018-11-16
    41
  • null
    红黑树的节点颜色,是如何确定的,如何知道在新增一个节点时,该节点是什么颜色? 从红黑树需要满足的四个要求来看: 1. 根节点为黑色 2. 所有叶子节点为黑色,且不存储数据 3. 相邻两个节点不能都为红色 4. 从某节点到其所有叶子节点的路径中,黑色节点数相同 从这四点要求,好像我一根树全是黑色,也是满足其定义的。这里用红黑两色区分各节点,意义是啥? 谢谢老师

    作者回复: 新插入的节点都是红色的。全黑不可能的。红黑区分的意义你等下一节课看看能懂不

    2018-11-16
    3
    15
  • increasingly
    请问什么是单次操作时间非常敏感的场景呢

    作者回复: 比如有些系统只关注操作的平均执行时间,大部分操作都很快,比如1s,极个别操作可能花费很多时间10s,但平均下来,整体上都很快,所以也能接受。 但是有的系统不仅仅关注平均执行时间,对单次操作的时间非常敏感,极个别的10s操作也是无法接受的。

    2019-02-21
    11
  • Laughing_Lz
    老师,你这里提到:我画了两个红黑树的图例,你可以对照着看下。 这下面的两张图,左边第一个,四个叶子节点都是红色呀?我有点看不懂。。 规则不是说叶子节点都是不存储数据的黑色空节点吗?这里是不是画错了? 如果你是说省略了黑色叶子节点,那就是说这四个红色节点下其实还有叶子节点?但是这样又不能满足规则四:每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点...除非第三层的第三个黑色子节点下也有叶子节点?

    作者回复: 是的 都会有nil的黑色叶子节点的

    2018-12-02
    2
  • 复兴
    红黑树是链表还是数组存储的呢

    作者回复: 都不是啊,是树

    2019-09-29
    1
  • TryTs
    老师你之前说过的成就感固然是吧!但是我觉得我的挫败感更大.....可能是我想一蹴而就了吧……还有我想请问一下老师你觉得比较有创意的计算机领域有哪些?

    作者回复: 区块链?人工智能?

    2018-11-21
    1
  • Northern
    红黑树的两个图例中,第一张图看不太懂,为什么叶子节点都是红色?这不符合红黑树的定义

    作者回复: 麻烦仔细读读文章 我前面有讲的

    2018-12-10
  • qinggeouye
    红黑树的第三点要求:「任何相邻的节点都不能同时为红色」,这里是否可以理解为子节点和它的父节点不能同时为空色? 本节第三幅图例的第二个红黑树,一开始对着平衡二叉树查找树的严格定义,发现左右子树的高度相差并不小于等于 1,但是又想到「近似」的含义,一下就释怀了。

    作者回复: 第一个问题 是的

    2018-12-02
  • 鹏程万里
    请问文中的这段话:“前面红黑树的定义里有这么一条:从任意节点到可达的叶子节点的每个路径包含相同数目的黑色节点。我们从四叉树中取出某些节点,放到叶节点位置,四叉树就变成了完全二叉树。所以,仅包含黑色节点的四叉树的高度,比包含相同节点个数的完全二叉树的高度还要小”-----这段话想表达的意思是仅包含黑色结点的四叉树的高度比相同结点个数的完全二叉树的高度小吗?那么这句话“从任意节点到可达的叶子节点的每个路径包含相同数目的黑色节点”想表达什么意思呢?是要把四叉树转换为满二叉树再去比较吗?

    作者回复: 第一个问题答案是yes 另外两个问的太笼统 没看懂

    2018-11-19
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部