初识红黑树

1,510 阅读8分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

红黑树前言

写在前面

文章摘要

  1. 初识红黑树
  2. 红黑树的五条性质
  3. 红黑树的平衡
  4. 红黑树 vs B树
  5. 红黑树 vs AVL树

阅读准备

一、初识

  • 在了解红黑树之前,先来看一棵红黑树大概长什么样子

image-20221108213645970

  • 有没有感觉很好看、很工整、很平衡、很有规律、很疑惑、很....
  • 没关系,不妨听我细细说来,咱们都能学会~
  • 同AVL树一样,红黑树也是一种自平衡的二叉搜索树。一开始被称为:对称二叉B树
  • 我们在AVL树中,通过树的旋转,维护了AVL树中特有的平衡因子,使其平衡。
  • 里面旋转的思想,在红黑树里也是需要使用的。这一点应该能想到。
  • 可为什么和B树也有关呢?难道红黑树它心里也有B树?

image-20221110101019826

  • 乍眼一看,红黑树好像确实很有4阶B树的样子哎
  • 那我们下面将一起来看看,我们之前学习的 AVL树B树,会与红黑树擦出什么样的火花
  • 但是在了解红黑树前,我们先来背背八股文

二、红黑树的性质

① 节点是红色或黑色

  • 红黑树是每个节点都带有颜色属性的二叉搜索树,颜色为红色或黑色
  • 红色和黑色代表什么呢?来看看维基百科的解释:

之所以选择“红色”是因为这是作者在帕罗奥多研究中心公司Xerox PARC)工作时用彩色激光打印机可以产生的最好看的颜色。另一种说法来自Guibas,是因为红色和黑色的笔是他们当时可用来绘制树的颜色。

  • 其实没有特殊含义,可能是因为时代的原因吧。也可能为了方便描述以下性质吧~

② 根节点是黑色

  • 根节点必须是黑色,这一点很好理解

③ 叶子节点都是黑色

  • 这里所说的叶子节点,和我们之前所说的叶子节点不太一样。红黑树中的叶子节点是:是外部的节点、是空的节点、是假想出来的节点

image-20221108220650745

④ 红色节点的子节点都是黑色

  • 换好几句话说就是:
    • 每个红色节点必须有两个黑色的子节点(叶子节点也算入其中)
    • 或者说从每个叶子到根的所有路径上不能有两个连续的红色节点
    • 或者说不存在两个相邻的红色节点,相邻指两个节点是父子关系
    • 或者说红色节点的父节点和子节点均是黑色的

⑤ 从任一节点到叶子节点的所有路径都包含相同数目的黑色节点

image-20221108221527557

  • 如图中所示,有三条颜色的路线,都是从同一个节点出发(这里是根节点)
  • 它们从不同路线,走到了不同的叶子节点
  • 但是它们所经历的黑色节点都是一样的:3个
  • 其它路线也是同理,不信你可以自己数一数~

总结

  • 要是一棵二叉搜索树拥有这五条性质,那么它就是一棵红黑树,也就拥有了自平衡的功能
  • 而且这五条性质是缺一不可的,要想是红黑树,就必须满足上述性质
  • ❓可是拥有了这五条性质,真的能够使二叉搜索树自平衡吗?别着急,听我细细道来~

三、红黑树与B树

  • 说完了红黑树的 5 条性质。为了能够更好的学习红黑树,我们先来看看它与B树之间的关系

image-20221109144719638

  • 从图中可以看出,我们将红色节点向上与黑色父节点合并后
  • 红黑树与四阶B树。也叫做(2,4)树、2-3-4树具有等价性
  • 将黑色节点与它的红色子节点融合在一起,会形成1个B树节点
  • 并且红黑树的黑色节点个数等于4阶B树的节点总数(黑节点数量 = 4阶B树节点数量)
  • 既然要用红色节点与黑色节点合并,那么合并后,就只有这四种情况:
    • 红黑红、黑红、红黑、黑
    • 建议可以眼熟一下,因为这里对后面红黑树添加、删除分析的理解尤为重要

image-20221109150438138

  • 既然等价于四阶B树,那我们一起来回想一下4阶B树的两个性质:
    • 根节点(2 ≤ 子节点个数 ≤ 4)、(1 ≤ 元素个数 ≤ 3)
    • 非根节点(2 ≤ 子节点个数 ≤ 4)、(1 ≤ 元素个数 ≤ 3)

四、红黑树的平衡

  • 看到这里,你可能还是会有这个疑惑:❓拥有这五条性质的二叉搜索树,就能保证它是平衡的吗?
  • 看完了红黑树与B树的等价变换,我们至少能保证:红黑树等价于4阶B树
  • 再来看看这一棵红黑树的等价变换:

image-20221119095219840

  • 红黑树的高度为4,和它等价的B树高度为2,将眼光放在这棵4阶B树上,肉眼可见它的平衡
  • 其实红黑树的平衡,在某种意义上来说,就是4阶B树的平衡。4阶B树有多么平衡,红黑树就有多么平衡。
  • 我们刚才所说,红黑树的黑色节点数量等于B树的节点数量,也就说明红黑树的平衡是一种黑高度平衡
  • 根据性质,也就可以知道,红黑树的平衡比较宽松:没有一条路径高度会大于其他路径高度的2倍

image-20221119100034477

  • 也就说明红黑树的平衡是一种弱平衡

红黑树的最大高度是 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)级别的旋转操作
  • 而在红黑树中,先说结论,之后的实现中再说明:

    • 添加和删除后,都仅需要O(1)级别的旋转操作即可维护红黑树的性质
  • 对于查询操作来说,因为红黑树的平衡不是很严格,相同数量的节点,大部分情况下,树的高度都比AVL树要高,所以,查询的速度AVL树会快一些。

  • “一图胜千言”(来自网络)

img

  • 其实综合看下来:
    • 查询的次数远远大于插入和删除的次数时,选用AVL树
    • 查询、添加、删除次数几乎差不多,选择红黑树
    • 相对于AVL树来说,红黑树牺牲了部分平衡,减少了插入、删除操作中旋转的次数

写在后面

本篇收获

  • 了解了红黑树以及它的五条性质
  • 红黑树与4阶B树的关系以及它们的等价转换
  • 红黑树与AVL树不一样的平衡

读后思考

  • 根据红黑树与4阶B树的关系,该用何总思路分析红黑树的添加、删除?