当前位置: 首页 > news >正文

【数据结构】二叉排序树——平衡二叉树的调整

文章目录

    • 前置概念
    • 一、构造平衡二叉树的基本思想
    • 二、一个示例
    • 三、平衡二叉树的调整细节
      • (1)LL型(顺时针 )
        • 举例
      • (2)RR型(逆时针)
      • (3)LR型(先逆时针再顺时针)
        • 举例
      • (4)RL型(先顺时针再逆时针)
      • (5)四种调整类型总结
    • 四、例题
      • 解题过程

参考视频:
懒猫老师-数据结构-(59)平衡二叉树【互动视频】

前置概念

最小不平衡子树:在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。

在这里插入图片描述

例如上图,此处4就是最小不平衡子树的根节点。

一、构造平衡二叉树的基本思想

每插入一个结点,

  • 从插入结点向上计算各结点的平衡因子,如果某结点的平衡因子的绝对值大于1,则说明插入操作破坏了二叉排序树的平衡性,需要进行平衡调整;否则继续执行插入操作。
  • 如果二叉排序树不平衡,则找出最小不平衡子树的根节点,根据新插入结点与最小不平衡子树根节点的关系判断调整类型。
  • 根据调整类型进行相应的调整,使之成为新的平衡子树。

二、一个示例

在这里插入图片描述

三、平衡二叉树的调整细节

设结点A为最小不平衡子树的根结点,对该子树平衡调整有以下四种情况:

  1. LL型
  2. RR型
  3. LR型
  4. RL型

(1)LL型(顺时针 )

插入结点X之后,这棵二叉树不平衡了。B结点的平衡因子变成1(h+1-h),A结点的平衡因子变成2(h+2-h)。这里我们称X结点为问题的发生者;A结点为问题的发现者。从问题的发现者A结点到问题的发生者要经过左子树的左子树(即LL)

现在A发现二叉树不平衡了,就需要对二叉树进行调整。

旋转:扁担原理; 冲突:旋转优先

在这里插入图片描述

利用扁担原理,A结点的左右子树不平衡了:左子树“重”,右子树“轻”。那么我们把B结点往上抬,A结点往下压(进行了一个顺时针旋转),A结点变成了B结点的右子树,B结点原来的右子树调整为A结点的左子树(B结点的右子树上的所有结点一定小于A结点,所以将B原来的右子树调整为A结点的左子树是最合适的)。

举例

在这里插入图片描述

在这里插入图片描述

(2)RR型(逆时针)

在这里插入图片描述

(3)LR型(先逆时针再顺时针)

在这里插入图片描述

理解记忆:想象我们正在背一个扁担,发现左边重,但对于左边来说,左边的右边又比较重,所以这个LR型调整成平衡二叉树更为复杂。我们先需要对左边好好调整一番,规整一下(逆时针旋转),调整成LL型,让所有重量完全彻底地压到左边。接着对得到的LL型一次性向右调整(顺时针旋转)。

举例

在这里插入图片描述

(4)RL型(先顺时针再逆时针)

在这里插入图片描述

(5)四种调整类型总结

在这里插入图片描述

四、例题

在这里插入图片描述

解题过程

在这里插入图片描述

  • 找到最小不平衡子树的根结点:5

  • 判断类型:从问题的发现者开始到问题的发生者,先左后右,画圈的为RL型不平衡树。注意:下面对画圈的部分独立操作。

  • 将RL型的不平衡树进行顺时针旋转变成RR型
    在这里插入图片描述

  • 插入结点9,发现二叉树又不平衡了,找到最小不平衡子树的根结点:4

在这里插入图片描述

  • 判断类型:RR型不平衡树
  • 对RR型不平衡树进行逆时针旋转

在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/1399.html

相关文章:

  • 03- pandas 数据库可视化 (数据库)
  • 第三方电容笔怎么样?开学适合买的电容笔
  • Java学习-IO流-字节输出流
  • linux性能分析 性能之巅学习笔记和内容摘录
  • 机器学习笔记之生成模型综述(三)生成模型的表示、推断、学习任务
  • 第八章 Flink集成Iceberg的DataStreamAPI、TableSQLAPI详解
  • PyTorch学习笔记:nn.Sigmoid——Sigmoid激活函数
  • 个人学习系列 - 解决拦截器操作请求参数后台无法获取
  • 【编程基础之Python】2、安装Python环境
  • Java开发 - 问君能有几多愁,Spring Boot瞅一瞅。
  • Office Server Document Converter Lib SDK Crack
  • Cubox是什么应用?如何将Cubox同步至Notion、语雀、在线文档中
  • 计算机网络-传输层
  • HTML-CSS-js教程
  • 【Nacos】Nacos配置中心客户端启动源码分析
  • 中国特色地流程管理系统,天翎让流程审批更简单
  • Python算法:DFS排列与组合算法(手写模板)
  • 拿来就用的Java海报生成器ImageCombiner(一)
  • 【C++】类和对象(二)
  • UDP协议
  • IT人的晋升之路——关于人际交往能力的培养
  • Docker进阶 - 8. docker network 网络模式之 container
  • 2年功能测试月薪9.5K,100多天自学自动化,跳槽涨薪4k后我的路还很长...
  • “数字孪生”:为什么要仿真嵌入式系统?
  • Java基础知识总结(上)
  • MySQL 2:MySQL约束
  • C4--Vivado添加列表中不存在的FLash器件2023-02-10
  • php代码审计
  • 接口测试入门,如何划分接口文档
  • 数据库学习第二天