数据结构——四十四、平衡二叉树的删除操作(王道408)

文章目录

前言

平衡二叉树的删除操作需要确保删除后仍保持二叉排序树特性和平衡性。删除步骤包括:1)按二叉排序树规则删除节点;2)向上查找最小不平衡子树;3)确定最高儿子和孙子;4)根据孙子位置(LL/RR/LR/RL)进行相应旋转调整。删除后若不平衡向上传导,需继续调整。文中通过删除55和32两个实例,分别展示了仅调整儿子节点和需要调整孙子节点的两种情况,并说明旋转后可能出现的不平衡传导现象。关键点在于通过旋转操作恢复平衡,同时保持二叉排序树的有序性。

一.平衡二叉树的删除操作的要求

  • 删除结点后,要保持二叉排序树的特性不变(左<中<右)
  • 若删除结点导致不平衡,则需要调整平衡

二.平衡二叉树的删除操作

1.思路

  1. 删除结点(方法同"二叉排序树")
    若删除的结点是叶子,直接删。
    若删除的结点只有一个子树,用子树顶替删除位置
    若删除的结点有两棵子树,用前驱(或后继)结点顶替,并转换为对前驱(或后继)结点的删除。
  2. 沿着父节点方向找到最小不平衡子树,找不到就完结撒花
  3. 找最小不平衡子树下,"个头"最高的儿子、孙子
  4. 根据孙子的位置,调整平衡(LL/RR/LR/RL)
    孙子在LL:儿子右单旋
    孙子在RR:儿子左单旋
    孙子在LR:孙子先左旋,再右旋
    孙子在RL:孙子先右旋,再左旋
  5. 如果不平衡向上传导,继续2这个操作
    对最小不平衡子树的旋转可能导致树变矮,从而导致上层祖先不平衡(不平衡向上传递)

2.具体例子

1.经过调整未出现不平衡向上传导

1.调整儿子
  • 删除55这个元素后,将其恢复平衡且依然满足二叉排序树规则
  1. 从55这个位置出发,沿着父节点的方向向上找到了60这个元素,其左右子树高度差为0,因此不属于最小不平衡子树
  2. 再往上走是75,其左右子树高度之差为-2,属于最小不平衡子树
  3. 75有两个儿子60和80,很显然,80这个儿子比60更高,接下来再从他最高的这个儿子80往下找,找最高的孙子,很显然是90
  4. 由于孙子90在RR,所以儿子80左单旋
  5. 由于刚才在我们调整平衡之前,我们的这颗树它的总高度是四,而我们进行左旋操作之后,它的总高度从4变成了3,就有可能会导致它上面的这些祖先进一步的产生不平衡的现象(不平衡向上传递)
  6. 这里显然没有出现这种情况,因此完成操作
2.调整孙子
  • 删除32这个元素后,将其恢复平衡且依然满足二叉排序树规则
  1. 根据二叉排序树的删除规则,32是叶子结点,可以直接删除
  2. 从32沿着其父结点向上,找到44为最小不平衡二叉树的根结点
  3. 44下个头最大的儿子是78,78下个头最大的孙子是50,所以孙子是RL类型的,因此对孙子50进行先右旋再左旋的双旋操作
  4. 经过调整后,并没有发生不平衡向上传导因此结束操作

2.经过调整出现不平衡向上传导(可能不会考)

  • 删除32这个元素后,将其恢复平衡且依然满足二叉排序树规则
  • 由于33的右子树和上一个例子相同,因此我们直接利用上一题的结论,得到下图
  1. 此时我们发现33的左子树和右子树的高度相差2,因此发生了"不平衡向上传递"
  2. 从刚才调整的这颗子树出发,沿着父节点找到最小不平衡子树33,发现其最高的儿子为10,在10这个子树中,最高的孙子是20,此时孙子的类型是LR
  3. 因此让孙子20进行先左旋再右旋的双旋操作
  4. 那么,此时可以发现二叉树已经平衡,因此操作结束

三.知识回顾与重要考点

结语

四更😉
如果想查看更多章节,请点击:一、数据结构专栏导航页

相关推荐
R1nG8639 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
_OP_CHEN9 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
郝学胜-神的一滴9 小时前
Python 列表 vs 数组:深入解析与最佳选择指南
开发语言·python·程序人生
四谎真好看9 小时前
JavaWeb学习笔记(Day13)
笔记·学习·学习笔记·javaweb
ZH15455891319 小时前
Flutter for OpenHarmony Python学习助手实战:机器学习算法实现的实现
python·学习·flutter
TracyCoder12310 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九10 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈10 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
承渊政道10 小时前
Linux系统学习【Linux基础开发工具】
linux·运维·笔记·学习·centos·编辑器
子春一10 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏