开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
红黑树前言
写在前面
文章摘要
- 初识红黑树
- 红黑树的五条性质
- 红黑树的平衡
- 红黑树 vs B树
- 红黑树 vs AVL树
阅读准备
- 建议阅读时间:5 ~ 10 分钟
- 本文提到的二叉搜索树、AVL树、B树,推荐阅读:
- 学习了AVL树,心里也有了点B树。今天我们来简单认识下红黑树吧~
一、初识
- 在了解红黑树之前,先来看一棵红黑树大概长什么样子
- 有没有感觉很好看、很工整、很平衡、很有规律、很疑惑、很.... ?
- 没关系,不妨听我细细说来,咱们都能学会~
- 同AVL树一样,红黑树也是一种自平衡的二叉搜索树。一开始被称为:
对称二叉B树 - 我们在AVL树中,通过树的旋转,维护了AVL树中特有的平衡因子,使其平衡。
- 里面旋转的思想,在红黑树里也是需要使用的。这一点应该能想到。
- 可为什么和B树也有关呢?难道红黑树它心里也有B树?
二、红黑树的性质
① 节点是红色或黑色
- 红黑树是每个节点都带有颜色属性的二叉搜索树,颜色为红色或黑色
- 红色和黑色代表什么呢?来看看维基百科的解释:
之所以选择“红色”是因为这是作者在帕罗奥多研究中心公司(Xerox PARC)工作时用彩色激光打印机可以产生的最好看的颜色。另一种说法来自Guibas,是因为红色和黑色的笔是他们当时可用来绘制树的颜色。
- 其实没有特殊含义,可能是因为时代的原因吧。也可能为了方便描述以下性质吧~
② 根节点是黑色
- 根节点必须是黑色,这一点很好理解
③ 叶子节点都是黑色
- 这里所说的叶子节点,和我们之前所说的叶子节点不太一样。红黑树中的叶子节点是:是外部的节点、是空的节点、是假想出来的节点
④ 红色节点的子节点都是黑色
- 换好几句话说就是:
- 每个红色节点必须有两个黑色的子节点
(叶子节点也算入其中) - 或者说从每个叶子到根的所有路径上不能有两个连续的红色节点
- 或者说不存在两个相邻的红色节点,相邻指两个节点是父子关系
- 或者说红色节点的父节点和子节点均是黑色的
- 每个红色节点必须有两个黑色的子节点
⑤ 从任一节点到叶子节点的所有路径都包含相同数目的黑色节点
- 如图中所示,有三条颜色的路线,都是从同一个节点出发(这里是根节点)
- 它们从不同路线,走到了不同的叶子节点
- 但是它们所经历的黑色节点都是一样的:3个
- 其它路线也是同理,不信你可以自己数一数~
总结
- 要是一棵
二叉搜索树拥有这五条性质,那么它就是一棵红黑树,也就拥有了自平衡的功能 - 而且这五条性质是缺一不可的,要想是红黑树,就必须满足上述性质
- ❓可是拥有了这五条性质,真的能够使二叉搜索树自平衡吗?别着急,听我细细道来~
三、红黑树与B树
- 说完了红黑树的 5 条性质。为了能够更好的学习红黑树,我们先来看看它与B树之间的关系
- 从图中可以看出,我们将
红色节点向上与黑色父节点合并后 - 红黑树与
四阶B树。也叫做(2,4)树、2-3-4树具有等价性 - 将黑色节点与它的红色子节点融合在一起,会形成1个B树节点
- 并且红黑树的黑色节点个数等于4阶B树的节点总数
(黑节点数量 = 4阶B树节点数量) - 既然要用红色节点与黑色节点合并,那么合并后,就只有这四种情况:
- 红黑红、黑红、红黑、黑
- 建议可以眼熟一下,因为这里对后面红黑树添加、删除分析的理解尤为重要
- 既然等价于
四阶B树,那我们一起来回想一下4阶B树的两个性质:- 根节点:
(2 ≤ 子节点个数 ≤ 4)、(1 ≤ 元素个数 ≤ 3) - 非根节点:
(2 ≤ 子节点个数 ≤ 4)、(1 ≤ 元素个数 ≤ 3)
- 根节点:
四、红黑树的平衡
- 看到这里,你可能还是会有这个疑惑:❓拥有这五条性质的二叉搜索树,就能保证它是平衡的吗?
- 看完了红黑树与B树的等价变换,我们至少能保证:红黑树等价于4阶B树
- 再来看看这一棵红黑树的等价变换:
- 红黑树的高度为4,和它等价的B树高度为2,将眼光放在这棵4阶B树上,肉眼可见它的平衡
- 其实红黑树的平衡,在某种意义上来说,就是4阶B树的平衡。4阶B树有多么平衡,红黑树就有多么平衡。
- 我们刚才所说,红黑树的黑色节点数量等于B树的节点数量,也就说明红黑树的平衡是一种黑高度平衡
- 根据性质,也就可以知道,红黑树的平衡比较宽松:没有一条路径高度会大于其他路径高度的2倍
- 也就说明红黑树的平衡是一种弱平衡
红黑树的最大高度是
2log2(n + 1),因此根的高度也是O(logn)
- 根据高度,也就可以得出红黑树的平均时间复杂度:
- 搜索、添加、删除:
O(logn)
- 搜索、添加、删除:
五、红黑树与AVL树
- 有了二叉搜索树,防止它退化成链表,出现了自平衡的二叉搜索树:
AVL树 - 而我们都知道,
AVL树的平衡标准比较严格:每个左右子树的高度差不超过1。据统计:- 同样100w个节点,AVL树最大高度为28,而红黑树最大高度为40
- 刚刚分析红黑树的时间复杂度,我们发现,其实和AVL树的是一样的,查询、添加、删除都是
O(logn)级别 - 那科学家之后为什么又发明了红黑树?并且实际应用也更广泛呢?
- 引用清华邓俊辉老师的话:
每次插入、删除操作,虽然最坏时间复杂度是O(logn) 但是,旋转操作只会进行常数次。也就是说只有常数个节点的拓扑结构发生改变,这个特性对持久性数据结构是至关重要的。
-
回顾一下
AVL树的实现中:- 添加后可能会导致一个或多个节点失衡,在解决最小的失衡节点后,就平衡了。最多需要2次旋转即可解决失衡,只需要
O(1)级别的旋转操作 - 删除后可能只会有一个节点失衡,但是在解决失衡后,还可能会出现失衡节点。也就是可能需要多次调用旋转逻辑,最多需要
O(logn)级别的旋转操作
- 添加后可能会导致一个或多个节点失衡,在解决最小的失衡节点后,就平衡了。最多需要2次旋转即可解决失衡,只需要
-
而在红黑树中,先说结论,之后的实现中再说明:
- 添加和删除后,都仅需要
O(1)级别的旋转操作即可维护红黑树的性质
- 添加和删除后,都仅需要
-
对于查询操作来说,因为红黑树的平衡不是很严格,相同数量的节点,大部分情况下,树的高度都比AVL树要高,所以,查询的速度AVL树会快一些。
-
“一图胜千言”(来自网络)
- 其实综合看下来:
- 查询的次数远远大于插入和删除的次数时,选用AVL树
- 查询、添加、删除次数几乎差不多,选择红黑树
- 相对于AVL树来说,红黑树牺牲了部分平衡,减少了插入、删除操作中旋转的次数
写在后面
本篇收获
- 了解了红黑树以及它的五条性质
- 红黑树与4阶B树的关系以及它们的等价转换
- 红黑树与AVL树不一样的平衡
读后思考
- 根据红黑树与4阶B树的关系,该用何总思路分析红黑树的添加、删除?