【数据结构】考研408|数据结构高分堡垒:攻克红黑树五大性质与适度平衡思想

红黑树的定义与性质

导读

大家好,很高兴又和大家见面啦!!!

在前面的内容中我们已经学习了两种树形查找结构:

  • BST :二叉排序树,其可以是一棵空树,也可以是满足以下条件的树:
    • 若左子树非空,则左子树上所有节点的值均小于根节点
    • 若右子树非空,则右子树上所有节点的值均大于根节点
    • 其左右子树也分别是一棵二叉排序树
  • AVL :平衡二叉树,其是一棵能够进行自平衡旋转的 BST

为了避免 BST 的树高增长的过快而导致其查找效率降低,因此引入了能够将左右子树的高度差控制在 − 1 ∼ 1 -1 \sim 1 −1∼1 之间的 AVL

AVL 通过判断树的 平衡因子,以此来决定是否需要进行平衡旋转:

  • 平衡因子 不在 − 1 ∼ 1 -1 \sim 1 −1∼1 这个范围内时,则说明该树已经失衡,需要通过自平衡旋转使其恢复平衡

正因如此,当我们进行频繁的插入或删除操作时,就很容易破坏 AVL 的平衡特性,而导致其需要进行频繁的平衡旋转操作;

为了优化这种情况,于是我们又再一次引入了一种新的自平衡排序树------ 红黑树

那什么是 红黑树 呢?相比于 AVL 其又有哪些优势呢?从今天的内容开始,我们将会逐步揭开 红黑树 的神秘面纱;

下面就让我们一起进入今天的内容;

一、基本概念

1.1 定义与性质

红黑树Red-Black Tree, RBT )是一种满足如下 红黑性质BST

  • 每个结点或是红色,或是黑色
  • 根结点是 黑色
  • 叶结点 (虚构的外部节点、NULL 结点)都是黑色
  • 不存在两个相邻的 红结点 (红结点的父结点与孩子结点均为黑色)
  • 对每个结点,从该结点出发,到任意叶结点的简单路径上,所含的黑结点的数量相同

上述的 五大基本性质定义 我们可以将其总结为十二个字:

  • 左根右RBT 是一种 BST ,满足 左子树 ≤ 根节点 ≤ 右子树 左子树 \leq 根节点 \leq 右子树 左子树≤根节点≤右子树
  • 根叶黑:根结点、叶结点一定是黑色
  • 黑路同:从任一结点出发,到达任一空叶结点的路径上经过的黑结点数量都相同
  • 不红红:任何一条查找路径上不能连续出现两个红结点

1.2 重要概念

黑高 :一个结点的黑高是指从该结点出发(不含该结点)到达任一空叶结点的路径上黑结点总数
叶结点 :在 RBT 中,"叶结点"通常指"失败结点 "(又名:空叶结点/NULL结点/外部结点)

下面我们就来通过一棵红黑树来进一步说明这些概念:
6
bh = 2 2
bh = 1 NULL
bh = 0 NULL
bh = 0 15
bh = 2 11
bh = 1 18
bh = 1 8
bh = 1 14
bh = 1 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 20
bh = 1 NULL
bh = 0 NULL
bh = 0

在上图中的这棵 RBT 中,其 根结点叶结点 一定是黑色,并且这些 叶结点 一定是 NULL 结点;

对于任一结点,其黑高指的是从该节点开始,到任一 叶结点 的路径上,不包含该结点的黑结点数量:

  • 根结点 6 ,其到任一 叶结点 的路径上都会包含2个黑结点,因此其黑高为 2
    • 6 ---> 2 ---> NULL ,包含除结点 6 外的两个黑结点:2NULL
    • 6 ---> 15 ---> 11 ---> 8 ---> NULL ,包含除了结点 6 外的两个黑结点:11NULL
  • 结点 2 ,其到任一 叶结点 的路径上都会包含1个黑结点,因此其黑高为 1
    • 2 ---> NULL ,包含除结点 2 外的一个黑结点:NULL

对于结点 6 而言,其左子树之所以为 ,是因为其右子树 15 的黑高为 2 ,为了满足 黑路同 ,因此结点 2 只能为

若我们将 2 变为红色,则会导致从结点 6 出发,到左子树中的任一叶结点,与到右子树中的任一叶结点所包含的黑结点数不一致;
6
bh_l = 1
bh_r = 2
bh_l != bh_r 2
bh = 1 NULL
bh = 0 NULL
bh = 0 15
bh = 2 11
bh = 1 18
bh = 1 8
bh = 1 14
bh = 1 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 20
bh = 1 NULL
bh = 0 NULL
bh = 0

因此结点 2 只能为

二、重要推论

RBT五大基本性质 中,我们可以得到 RBT 的三条 重要推论

  • 从根结点到叶结点的最长路径不大于最短路径的2倍
  • 有n个内部结点的红黑树高度 h < = 2 l o g 2 ( n + 1 ) h<=2log_2(n+1) h<=2log2(n+1)
  • 新插入红黑树中的结点初始着为红色

今天我们需要重点介绍前两条推论;

2.1 推论1

当从根结点出发,到任一叶结点的简单路径最短时,这条路径上的结点必然都是黑色,如最短简单路径:6 --> 2 ---> NULL

当某条路径最长时,这条路径必然是由黑结点与红结点相间构成,如:6 ---> 15 ---> 11 ---> 14 ---> NULL

可以看到这两条路径的长度分别为:35 ,而 5 < 3 ∗ 2 5 < 3 * 2 5<3∗2 ;

  • 若我们在最长路径中插入一个结点使其长度变为最短路径的两倍,即最长路径长度变为:6 ,那么根据红黑性质------不红红根叶黑 ,对应的路径上其结点的颜色一定是:黑 ---> 红 ---> 黑 ---> 红 ---> 黑 ---> 黑 ,其根结点的黑高为: bh = 3
  • 最短路径保持不变,即最短路径长度为:3 ,并且该路径上的结点均为黑色,即:黑 ---> 黑 ---> 黑,其根结点的黑高为:bh = 2
  • 显然此时的最短路径与最长路径,其根结点不满足红黑性质------黑路同 ,因此我们可以得到结论:从根结点到叶结点的最长路径 一定小于 最短路径的2倍

两种计算路径长度的方法

这里有朋友可能会好奇,为什么这里的性质说的是 不大于 而我们得到的结论是 一定小于

对于这个问题,我给出的解释是:我这里给出的实例所计算路径长度的方法与推论1的表述是不一致的:

  • 方法一:计算完整路径长度,即从根结点到外部结点的总长度
  • 方法二:计算内部路径长度,即从根结点到内部叶结点的总长度

前面我所展示的路径长度计算方法使用的是方法一,因此我们会得出 严格小于 这个结论;

当我们采用方法二进行计算时,那么其最短路径长度与最长路径长度分为为:

  • 最短路径:6 ---> 2 ,长度为 2
  • 最长路径:6 ---> 15 ---> 11 ---> 14 ,长度为 4

可以看到此时的最长路径长度就与最短路径长度的两倍相等;

因此 推论1 的表述是以方法二的方式计算路径长度得出的结论,而 严格小于 也属于 不大于 的范畴,所以,我们如果通过方法一的方式计算路径长度,我们同样也可以说 不大于

希望大家能够准确辨别 空叶结点内部叶结点 这二者的区别,切记不能将二者混为一谈!!!

插入法

推论1的验证,我们还有一个更简便的方法------插入法;

这里我们以下图进行简单的说明:
黑 黑 黑

在这条仅由黑色块组成的路径中,我们需要插入红色块,并且保证该路径的起点与终点为黑色,且插入的红色块不能连续,那么我们能够插入的红色块最多只有2块:
黑 黑 黑 红 红

当我们去掉终点的黑色块后,我们不难发现,这时的红色块与黑色块的数量是相同的:
黑 黑 红 红

每个黑色块后都紧跟一个红色块,这样我们就能得到以下结论:

  • 当计算终点黑色块时,红色块的总数比黑色块少 1
  • 当不计算终点黑色块时,红色块的总数与黑色块相等

因此对于最短路径长度为 N N N 的 RBT ,其最长路径长度为:

  • 计算终点的空叶结点时,最长路径长度为 2 ∗ N − 1 2 * N - 1 2∗N−1
  • 不计算终点的空叶结点时,最长路径长度为 2 ∗ N 2 * N 2∗N

这也进一步验证了推论1:

  • 从根结点到叶结点的最长路径不大于最短路径的 2 2 2 倍

2.2 推论2

由推论1可知,在红黑树中,其最长路径所包含的红结点是最多的,且不管是用方法一计算长度还是方法二计算长度,其红结点的数量一定不会超过黑结点的数量,即对于长度为 2N 的最长路径:

  • 由方法一计算得出:其红结点的数量一定是 N - 1 ,黑结点的数量一定是 N + 1
  • 由方法二计算得出:其红结点的数量一定是 N,黑结点的数量一定是 N

当我们只分析 内部结点 时,即采取 方法二 的方式计算一条路径的长度,那么对于 n 个内部结点的红黑树,其树高为 h ,这也就表明该 RBT 的最长路径长度为 h

对于一棵 RBT 而言,当其最长路径中的红结点数量最多时,其黑高最小;

在这棵 RBT 中,其仅计算内部结点的最长路径长度为 h ,这样我们就能得到红结点最多时,其红黑结点的数量均为 h 2 \frac{h}{2} 2h ;

而我们要计算根结点的黑高时,我们需要去掉根节点 ,并加上路径的终点------空叶结点 ,这也就是说,根结点的黑高至少为 h 2 \frac{h}{2} 2h ;

由二叉树的性质我们可知,对于结点数量为 n n n ,树高为 h h h 的二叉树,其结点数量 n n n 与树高 h h h 之间的关系为:

  • 满二叉树时, n n n 最大, n = 2 h − 1 n = 2^{h} - 1 n=2h−1
  • 只存在一条路径时, n n n 最小, n = h n = h n=h

RBT 中,其内部结点数 n n n 与其黑高 b h bh bh 之间的关系为: n ≥ 2 b h − 1 n \geq 2^{bh} - 1 n≥2bh−1 ,该结论我们可以通过 数学归纳法 进行证明;

内部结点数与黑高关系证明

分治思想 我们可以得到,RBT 的内部总结点数是由三部分组成:

  • 根节点
  • 左子树的内部结点总数
  • 右子树的内部结点总数

因此我们要求 RBT 的内部结点总数 n n n 就需要获取其左右子树中的结点总数;

假设对于一棵 RBT ,其任一结点 x x x 的黑高为 b h x bh_x bhx ,以该结点为根的子树的内部结点总数为 n x n_x nx ;

当该结点为 空叶结点 时 ,其黑高 b h x = 0 bh_{x} = 0 bhx=0 ,其内部结点数为: n x = 2 b h x − 1 = 2 0 − 1 = 1 − 1 = 0 n_{x} = 2^{bh_{x}} - 1 = 2^0 - 1 = 1 - 1 = 0 nx=2bhx−1=20−1=1−1=0,此时结论成立;

RBT 中,其任一结点 x x x 的左右子树的黑高至少为: b h x − 1 bh_{x} - 1 bhx−1

这是因为当结点 x x x 的子树根结点为黑结点时,其子树的黑高为: b h x − 1 bh_{x}- 1 bhx−1 ;
bh = 2 bh = 1 bh = 1 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0

当结点 x x x 的子树根结点为红结点时,其子树的黑高为: b h x bh_{x} bhx;
bh = 1 bh = 1 bh = 1 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0 NULL
bh = 0

因此我们可以假设:任一结点 x x x 其左右子树的内部结点数量为:

n x l ≥ 2 b h x − 1 − 1 n x r ≥ 2 b h x − 1 − 1 n_{x_l} \geq 2^{bh_x - 1} - 1 \\ n_{x_r} \geq 2^{bh_x - 1} - 1 nxl≥2bhx−1−1nxr≥2bhx−1−1

那么对于以结点 x x x 为根的子树,其内部结点数量 n x n_x nx 为:

n x = n x l + n x r + 1 n x ≥ 2 b h x − 1 − 1 + 2 b h x − 1 − 1 + 1 n x ≥ 2 ∗ 2 b h x − 1 − 1 n x ≥ 2 b h x − 1 \begin{align*} n_x &= n_{x_l} + n_{x_r} + 1 \\ n_x &\geq 2^{bh_x - 1} - 1 + 2^{bh_x - 1} - 1 + 1 \\ n_x &\geq 2 * 2^{bh_x - 1} - 1 \\ n_x &\geq 2^{bh_x} - 1 \end{align*} nxnxnxnx=nxl+nxr+1≥2bhx−1−1+2bhx−1−1+1≥2∗2bhx−1−1≥2bhx−1

推论2的证明

在前面我们已经证明了,一棵高度为 h h h 的 RBT ,其黑高 b h ≥ h 2 bh \geq \frac{h}{2} bh≥2h ;

现在我们只需要将黑高 b h bh bh 带入到内部结点 n n n 与 黑高 b h bh bh 的公式 n ≥ 2 b h − 1 n \geq 2^{bh} - 1 n≥2bh−1 中,就可以得到推论2:

n ≥ 2 b h − 1 n ≥ 2 h 2 − 1 n + 1 ≥ 2 h 2 log ⁡ 2 ( n + 1 ) ≥ h 2 2 ∗ log ⁡ 2 ( n + 1 ) ≥ h \begin{align*} n &\geq 2^{bh} - 1 \\ n &\geq 2^{\frac{h}{2}} - 1 \\ n + 1 &\geq 2^{\frac{h}{2}} \\ \log_2 (n + 1) &\geq \frac{h}{2} \\ 2 * \log_2 (n + 1) &\geq h \end{align*} nnn+1log2(n+1)2∗log2(n+1)≥2bh−1≥22h−1≥22h≥2h≥h

当一棵 RBT 的黑高为 b h = h bh = h bh=h 时,其对应的树高为与内部结点数分别为:

  • 当最长路径中不存在红结点时,树高最小为 h h h ,对应的内部结点数最少,为 2 h − 1 2^h - 1 2h−1
  • 当最长路径中红结点数量最多时,树高最大为 2 h 2h 2h ,对应的内部结点数最大,为 2 2 h − 1 2^{2h} - 1 22h−1

可见,RBT适度平衡 ,由 AVL高度平衡 ,降低到了 任一结点左右子树的高度,相差不超过 2 2 2 倍。这种调整同时也降低了动态操作时的调整频率。

RBT与AVL

对于一棵动态查找树,若插入和删除操作比较少,查找操作比较多,则采用 AVL 比较合适,否则采用 RBT 比较合适。

由于维护 AVL 这种 高度平衡 所付出的代价比获得的效益大的多,因此在实际应用中,RBT 的应用更为广泛,如 C++ 中的 map/setJAVA 中的 TreeMap/TreeSet 就是用 RBT 实现的。

结语

通过本文的学习,我们系统性地探讨了红黑树Red-Black Tree, RBT)的核心定义与关键性质。

红黑树作为一种自平衡的二叉查找树,通过其独特的五大性质确保了树的近似平衡:

  • 根叶黑:根结点与叶结点(空叶结点)均为黑
  • 不红红:不存在连续的两个红结点
  • 黑路同:从任一结点 x x x 出发,到达任一叶结点的简单路径上的黑结点数量相同

与AVL树对高度平衡的严格要求不同,红黑树以"适度平衡"换取了在频繁插入删除场景下更少的旋转操作,这使得它的实际应用更为广泛,如C++ STL中的map/setJavaTreeMap/TreeSet

📌 核心知识点回顾

  • 最长路径不超过最短路径的两倍

    • 这一特性源于"红结点不相邻"和"黑路同"的约束,保证了红黑树不会退化为近似链表的形态
  • 树高 h ≤ 2 log ⁡ 2 ( n + 1 ) h \leq 2 \log_2(n+1) h≤2log2(n+1)

    • 此性质决定了红黑树的搜索效率为 O ( l o g n ) O(log n) O(logn),尽管平衡性略逊于AVL 树,但维护成本更低
  • 实际应用优势

    在需要频繁动态更新的场景中,红黑树的统计性能更优,是效率与实用性平衡的典范

🔜 下一篇内容预告

在接下来的篇章中,我们将深入探讨红黑树最核心的操作------插入操作,重点分析:

  • "红插"原则:新节点为什么默认为红色
  • 平衡调整策略:变色与旋转(左旋、右旋)的组合运用
  • 双红冲突处理:叔叔节点颜色不同时的差异化处理方案

掌握这些情况及其处理流程,是真正理解和应用红黑树的关键。敬请期待!

互动与分享

  • 点赞👍 - 您的认可是我持续创作的最大动力

  • 收藏⭐ - 方便随时回顾这些重要的基础概念

  • 转发↗️ - 分享给更多可能需要的朋友

  • 评论💬 - 欢迎留下您的宝贵意见或想讨论的话题

感谢您的耐心阅读! 关注博主,不错过更多技术干货。我们下一篇再见!

相关推荐
瑶光守护者5 小时前
【学习笔记】5G RedCap:智能回落5G NR驻留的接入策略
笔记·学习·5g
你想知道什么?5 小时前
Python基础篇(上) 学习笔记
笔记·python·学习
SHOJYS5 小时前
学习离线处理 [CSP-J 2022 山东] 部署
数据结构·c++·学习·算法
xian_wwq6 小时前
【学习笔记】可信数据空间的工程实现
笔记·学习
ada7_6 小时前
LeetCode(python)108.将有序数组转换为二叉搜索树
数据结构·python·算法·leetcode
浩瀚地学6 小时前
【Arcpy】入门学习笔记(五)-矢量数据
经验分享·笔记·python·arcgis·arcpy
仰泳的熊猫6 小时前
1084 Broken Keyboard
数据结构·c++·算法·pat考试
Li.CQ6 小时前
SQL学习笔记
笔记·sql·学习
云霄星乖乖的果冻7 小时前
01引言——李沐《动手学深度学习》个人笔记
人工智能·笔记·深度学习
AI视觉网奇7 小时前
移动端数字人 Ultralight-Digital-Human 算法笔记
笔记·计算机视觉