考研408--数据结构--day13--平衡二叉树&红黑树

(以下内容全部出自上述课程)

目录

  • 平衡二叉树
    • [1. 定义](#1. 定义)
    • [2. 插入操作](#2. 插入操作)
    • [3. 插入新结点后如何解决不平衡问题](#3. 插入新结点后如何解决不平衡问题)
      • [3.1 LL](#3.1 LL)
      • [3.2 RR](#3.2 RR)
      • [3.3 LR](#3.3 LR)
      • [3.4 RL](#3.4 RL)
      • [3.5 小结](#3.5 小结)
    • [4. 填个坑](#4. 填个坑)
    • [5. 练习](#5. 练习)
      • [5.1 RR型](#5.1 RR型)
      • [5.2 RL型](#5.2 RL型)
      • [5.3 LR型](#5.3 LR型)
    • [6. 查找效率分析](#6. 查找效率分析)
    • [8. 小结](#8. 小结)
  • 平衡二叉树的删除
    • [1. 删除](#1. 删除)
    • [2. 删除操作实例](#2. 删除操作实例)
      • [2.1 例1-删9](#2.1 例1-删9)
      • [2.2 例2-删55](#2.2 例2-删55)
      • [2.3 例3-删32](#2.3 例3-删32)
      • [2.4 例4-删32](#2.4 例4-删32)
      • [2.5 例5-删75](#2.5 例5-删75)
      • [2.6 例6-删75](#2.6 例6-删75)
    • [3. 小结](#3. 小结)
  • 红黑树的定义和性质
    • [1. 定义](#1. 定义)
    • [2. 练习:是否符合红黑树要求?](#2. 练习:是否符合红黑树要求?)
    • [3. 黑高](#3. 黑高)
    • [4. 性质](#4. 性质)
    • [5. 查找](#5. 查找)
  • 红黑树的插入
    • [1. 概述](#1. 概述)
    • [2. 练习](#2. 练习)
    • [3. 小结](#3. 小结)
  • 红黑树的删除

平衡二叉树

1. 定义

就是两边高度看着差不多,不会出现一条腿特别长另一条腿特别短的情况。

  • 结点的平衡因子=左子树高-右子树高
  • 平衡二叉树:树上任一结点的平衡因子为-1、0、1.

2. 插入操作

当我们对平衡二叉树进行插入操作 的时候,很容易会把这棵树变得不平衡 ,那么我们该怎么办呢?

我们需要顺着插入的结点向上寻找,找到第一个不平衡的结点 ,调节该结点为根的子树。

比如:右图中我们插入67 导致二叉树不平衡,我们就算出每个结点的平衡因子,当平衡因子为-2 的时候,就代表这个结点不平衡 ,也就是从70 开始向上的结点都不平衡,我们就要调整以70为根的子树 ,这个子树就是最小不平衡树

当我们调整了这个最小不平衡树,上面原本不平衡的结点,也会随着它的调整逐渐平衡。

3. 插入新结点后如何解决不平衡问题

3.1 LL

  • LL:在左孩子的左子树上插入了新的结点。
  • 右单旋转 :B上A下,因为A下来变成了B结点的右孩子,BR就多出来了,就让给A带。

3.2 RR

  • RR:在右孩子的右子树上插入了新的结点。
  • 左单旋转:B上A下,因为A下来变成了B结点的右孩子,BL就多出来了,就让给A带。
  • 往哪边儿旋转,哪边儿的孩子就被抛弃。

    代码思路:就是指明谁代替了谁,成为了什么。

右单旋转:

  • p的右孩子成为了f的左孩子
  • f成为了p的右孩子
  • p成为了根节点

3.3 LR

  • LR :在左孩子的右子树上插入了新的结点。
  • 先左后右 :C最后是根节点,因为左旋和B换,所以C的左孩子让给B;因为右旋和A换,所以C的右孩子让给A。

3.4 RL

  • RL :在右孩子的左子树上插入了新的结点。
  • 先右后左 :C最后是根节点,因为右旋和B换,所以C的右孩子让给B;因为左旋和A换,所以C的左孩子让给A。

3.5 小结

4. 填个坑

我们之前说想让插入后的不平衡的二叉树重新平衡,只需要调整最小不平衡子树,那么为什么呢?

实际上,在 AVL 插入操作中,旋转后最小不平衡子树的高度 会恢复为插入前的高度

因为高度没变:

  • 它的父节点的 左右子树高度差没有改变;
  • 所以父节点的平衡因子不变;
  • 祖先节点的平衡因子也都不变;
  • 整棵树除了这个局部区域外,其他部分仍然满足 AVL 性质

    因此,只需调整最小不平衡子树一次,整棵树就重新平衡了。

5. 练习

5.1 RR型


5.2 RL型



5.3 LR型


6. 查找效率分析


8. 小结

平衡二叉树的删除

1. 删除

删除操作和插入操作相同,都会使得二叉树不平衡,所以关键点都是需要将二叉树最后恢复平衡状态。

具体调整方法和插入方法相同。

具体删除方法和二叉排序树相同。

二叉排序树具体可见:二叉排序树

2. 删除操作实例

2.1 例1-删9

叶子节点直接删。

2.2 例2-删55

一路向北找到最小不平衡子树

然后就可以找到个头最高的儿子个头最高的孙子

孙子右孩子的右子树上,即RR

所以采取左单旋转 ,调整平衡。

旋转后:

此时已经是平衡的了,所以第五步直接跳过

2.3 例3-删32

叶子节点直接删除

找到最小不平衡树

找到个头最高的儿子和孙子

孙子是根节点的右孩子的左子树,即RL

所以需要先右旋再左旋:

平衡后:

此时已经是平衡的了,所以第五条步骤直接跳过。

2.4 例4-删32

这里和例3删除过程完全相同。

到达最后一步,我们不难看出此时的二叉树依旧是不平衡的。

所以我们重新返回步骤二,找到最小不平衡子树。

找到个头最高的儿子、孙子。

孙子在根节点的左孩子的右子树上,即LR

所以我们需要先左旋,后右旋。

左旋后:

右旋后:

最后成功实现平衡。

2.5 例5-删75

这次删除的结点有两颗子树。

用前驱结点顶替被删除结点的位置。

变成这样:

然后继续老顺序:



2.6 例6-删75

这次用后继结点来顶替被删除结点的位置:


孙子用95:


孙子用85:



3. 小结

红黑树的定义和性质

1. 定义

因为平衡二叉树插入删除都会影响平衡就需要调整树的形态,所以红黑树就出现了,因为红黑树在插入删除的时候不需要调整树的形态。
省流版 :平衡二叉树-->插入删除繁琐;红黑树-->插入删除简单。

其实就是从根节点开始,一层红一层黑,依次往下。

  • 左根右:值从小往大
  • 根叶黑:根节点和叶子节点是黑色的
  • 不红红:红色不会和红色连在一起
  • 黑路同 :到达一个结点,经过的黑色结点数量都是相同的。

2. 练习:是否符合红黑树要求?





3. 黑高

  • 6~2下面的空叶子节点:经过6、2,所以bh=2
  • 2~自己下面的空叶子节点:经过2.所以bh=1
  • 2下面的空叶子结点~自己本身:没经过任何结点,所以bh=0

4. 性质

5. 查找

红黑树的插入

1. 概述

2. 练习

  • 添加20:根节点,为黑色
  • 添加10:非根,为红色
  • 添加5:非根,为红色-->违反不红红-->黑叔-->LL型-->旋转+染色
  • 添加30:非根,为红色-->违反不红红-->红叔-->染色+变新
  • 添加40:非根,为红色-->违反不红红-->黑叔-->RR型-->旋转+染色
  • 添加57:非根,为红色-->违反不红红-->红叔-->染色+变新
  • 添加3:非根,为红色
  • 添加2:非根,为红色-->违反不红红-->黑叔-->LL型-->旋转+染色
  • 添加4:非根,为红色-->违反不红红-->红叔-->染色+变新
  • 添加35:非根,为红色
  • 添加25:非根,为红色
  • 添加18:非根,为红色
  • 添加22:非根,为红色-->违反不红红-->红叔-->染色+变新
  • 添加23:非根,为红色-->违反不红红-->黑叔-->LR型-->旋转+染色



  • 添加24:非根,为红色-->违反不红红-->红叔-->染色+变新
  • 变新-->违反不红红-->黑叔-->LR型-->旋转+染色



  • 添加19:非根,为红色
  • 添加18:非根,为红色-->违反不红红-->黑叔-->RL型-->旋转+染色



3. 小结




红黑树的删除


相关推荐
故事和你914 分钟前
洛谷-【图论2-2】最短路1
开发语言·数据结构·c++·算法·动态规划·图论
Simple-Soft8 分钟前
指针的高级应用与技巧 - C语言的灵魂
c语言·数据结构·算法
Controller-Inversion1 小时前
23. 合并 K 个升序链表
数据结构·链表
Mr_pyx1 小时前
面试题记录
jvm·数据结构·算法·spring·mybatis
努力努力再努力wz1 小时前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
iiiiyu1 小时前
⾯向对象和集合编程题
java·大数据·开发语言·数据结构·编程语言
YuanDaima20481 小时前
贪心算法基础原理与题目说明
数据结构·人工智能·python·算法·贪心算法·手撕代码
人道领域2 小时前
【LeetCode刷题日记】513.二叉树左下角值的三种解法:从常规BFS到DFS的优雅之旅
数据结构·算法·leetcode·深度优先·广度优先
雁迟2 小时前
第七章:R 向量用法(最核心数据结构)
开发语言·数据结构·r语言
兰令水2 小时前
topcode【随机算法题】【2026.5.16打卡-java版本】
java·数据结构·算法