在这里插入图片描述
(以下内容全部出自上述课程)

平衡二叉树

请添加图片描述

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. 小结

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

红黑树的删除

请添加图片描述
请添加图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐