AVL右旋转思路分析与图解

news2025/4/9 15:59:35

AVL树右旋转思路分析与图解

其实我们前面讲过了左旋转之后再学习右旋转就会非常的简单了, 因为我们的右旋转相对我们的左旋转只是换了一个方向而已, 那么下面我们就来讲解右旋转的实现

对于数列{10, 12, 8, 9 ,7, 6} , 当我们插入6的时候leftHeight() - rightHeight() > 1成立(也就是此时的树成为了一颗不平衡树, 并且这个时候我们观察构成的AVL树之后我们可以发现此时的最小不平衡子树是一个LL型的不平衡子树), 所以这个时候我们就要采用某种操作让这个不平衡的树重新平衡起来, 那么我们要如何处理之后可以让这个树重新平衡起来?

  • 因为这时候的最小不平衡子树是一个LL型最小不平衡子树, 所以我们此时只要对这个最小不平衡子树的根节点执行一个右旋转即可完成平衡化处理:

那么如何实现右旋转? 我们这里通过图解来进行描述:

在这里插入图片描述

右旋转的具体实现过程:

  1. 创建一个新的结点newNode, 值等于当前最小不平衡二叉树根节点的值
  2. 让新结点newNode的右子结点指向当前根节点的右子树
  3. 让新结点的左子节点指向当前根节点的左子节点的右子树
  4. 让当前根节点的值换为当前根节点的左子节点的值
    • 因为右旋的时候旧根节点的左子结点的值就是我们的新根节点值
  5. 把根节点的左子树设置为当前根节点的左子树的左子树( 将原本存储新根节点值的结点从树中删除掉)
  6. 把根节点的右子树设置为新结点

注意: 整个过程中根节点是没有变的, 只是根节点的值发生了改变

右旋的核心思想: (两步)

  1. 原本旧根结点为现在新根节点的右子树
  2. 原本新根节点的右子树变为现在旧根结点的左子树

这里我们来对左旋和右旋进行一个易错归纳(我们以左旋为例):

  1. 对于如下结构的左旋到底是如何实现的:
    在这里插入图片描述
  • 首先我们要知道上图的最小不平衡子树并不是整棵树, 而是如下的子树:

在这里插入图片描述

  • 所以我们最终应该是对这个最小不平衡子树的根节点执行一个左旋的操作, 因为此时的最小不平衡子树显然是一个RR型最小不平衡子树, 最终这个最小不平衡子树会变成如下:
    在这里插入图片描述

  • 这个时候我们要注意: 我们的根节点一直没有变化过, 这个时候只是原本的根节点的值从3变为了4, 但是节点并没有发生变化, 所以也就是这个最小不平衡子树一直没有和整个树断开连接, 因为根节点始终没有变过, 所以最终平衡之后就会是如下:

在这里插入图片描述

  • 最终得到了如上的平衡二叉树, 我们的平衡化就算是完成了, 但是这个时候有的人会提出一个思路: 就是我们可不可以通过改变指针的指向, 不用创建新的结点来完成这次左旋操作?(比如说改变②结点的指向, 直接让②结点指向④结点)
    • 答案是不建议的(我们一般不这么做), 因为最终左旋操作是在递归中执行的, 最终我们是会拿到最小生成树的根节点, 也就是④结点, 所以我们无法改变②结点的指向, 如果我们非要拿到②结点肯定也是可以的, 但是这样的算法的效率可能就不会太高 —> 所以我们建议的就是通过建立一个新的节点的方式来完成, 这样的效率是比较高的, 并且实现起来的思路也比较简单
  1. 左旋和右旋其实就是一个针对RR型和LL型最小不平衡子树的平衡算法, 这个算法的核心是(我们以左旋为例): 降低最小不平衡子树的根节点的右子树的高度
    • 这里我们其实就是将最小不平衡子树的右子树的高度降低了1, 然后将最小不平衡子树的左子树的高度加了1

      • 而我们要降低最小不平衡子树的根节点的右子树的高度, 肯定是要通过变动二叉树结构来实现, 所以我们其实只需要知道如何变动即可:

        • 我们只需要让最小不平衡子树的根节点的值变为根节点右子节点的值, 然后做了这一步操作之后树中的结构以及元素每个值的元素的个数都会不平衡, 所以我们只需要通过一系列操作之后重新让树平衡起来, 这样的算法就是**“左旋算法”**

          • 上面只是一种实现: 我们是先将原本的根节点保存下来, 然后通过改变根节点的值实现的左旋, 这种实现的好处就是根节点并没有变化, 所以最小不平衡子树和整个不平衡树并没有失去连接, 这种方式比较好操作, 好理解.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 之 Ubuntu 代码开发工具 Visual Studio Code(VSCode) 的安装与一些常用插件配置的简单整理

Linux 之 Ubuntu 代码开发工具 Visual Studio Code(VSCode) 的安装与一些常用插件配置的简单整理 目录 Linux 之 Ubuntu 代码开发工具 Visual Studio Code(VSCode) 的安装与一些常用插件配置的简单整理 一、简单介绍 二、Visual Studio Code 下载与安装 三、 Visual Studio…

【操作系统】第一章总结

1.1 操作系统介绍 1.1.1 操作系统的概念、功能和目标 1.1.1 操作系统的概念、功能和目标(系统资源的管理者、提供接口、作为扩充机器、虚拟机)_StudyWinter的博客-CSDN博客 1.1.2 操作系统的特点 1.1.2 操作系统的特征(并发、共享、虚拟、…

[附源码]SSM计算机毕业设计基于Java烟支信息管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【计算机视觉OpenCV基础】实验四 尺寸测量

实验四 尺寸测量 计算机视觉OpenCV基础实验合辑(实验1234扩展) 资源下载地址: https://download.csdn.net/download/weixin_53403301 合辑:(加在下载地址后面) /87113581 讲义(包括理论、图例、…

RVMedia VCL 8.0 for Delphi 10.1-10.4

RVMedia VCL 8.0 for Delphi 10.1-10.4 RVMedia是Dolphi和Lazarus的VCL和LCL计算机的集合,为视频处理提供了不同的功能。在RVMedia中,可以使用GStreamer和FFmpeg库以H.264等高级格式显示视频。请注意,此组不包含这两个库的源代码,…

临近2022年末: Android 开发者的出路在哪?转行还是进阶?

你可能知道 Android 的近况,大体上现在移动开发已经不像以前那么活跃了,完全没有了几年安卓开发的那种火热势头。 与此同时,有很多发言说 Android 的开发冷却了,不行了,没有前途了 那么到底该如何看待这一现象呢&#…

C++对象内存布局

文章目录一、不存在virtual的对象和继承结构二、基类包含virtual的单继承结构2.1、派生类不覆盖虚函数的情况2.2、派生类覆盖虚函数的情况三、基类中包含virtual的多继承结构3.1、派生类中未覆盖基类中的虚函数3.1、派生类中覆盖了基类中的虚函数四、虚继承下单继承结构4.1、派…

面经汇总--校招--金山办公

参考链接:https://www.nowcoder.com/experience/639 用于汇总Java后端各个校招、社招、实习面经,附自己答案 文章目录🔥1. 一面🔥2.二面🔥2.HR面🔥1. 一面 ConcurrentHashMap原理:JDK1.8之后是v…

低代码与医疗的结合

全文 2566 字 阅读时间越约 8 分钟 本文首发于码匠技术博客 目录 低代码能为医疗领域带来哪些好处? 低代码有哪些功能适用于理疗领域? 低代码使用案例 关于码匠 现如今各行各业都在通过互联网技术加速数字化转型,医疗领域也不例外。低…

隐私计算 FATE - 多分类神经网络算法测试

一、说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练,并使用该模型对数据进行 多分类预测。 二分类算法:是指待预测的 label 标签的取值只有两种;直白来讲就是每个实例的可能类别只有两种 (0 或者 1)&…

【微机接口】可编程串行异步通信芯片8250

8250能实现数据串并变换,实现全双工异步通信。 支持异步通信协议,数据格式、通信速率由初始化编程设定。 内部有中断机制,CPU可用查询中断方式与之交换信息。 8250内部寄存器: 发送保持寄存器:保存CPU传送来的并行数…

通过sls采集k8s集群上的服务日志

1. 概述 日志服务SLS是阿里云提供云原生观测与分析平台,供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能。 sls采集K8S集群的日志,通过安装logtail dameonset,结合sls 控制台方式采集容器文本日志、控制台日志,通…

长链点击化学PEG试剂m-PEG12-DBCO用于生物标记

m-PEG12-DBCO物理参数: CAS号:N/A | 英文名:m-PEG12-DBCO | 中文名:甲基-十二聚乙二醇-二苯并环辛炔 分子式:C44H66N2O14 分子量:847 纯度标准:95%(HPLC) 外形颜色:淡黄色油状&…

MacBookPro 安装cx_Oracle,并配置环境

一、安装cx_Oracle 本机系统:macOS Monterey 版本 12.5 Anaconda版本:Anaconda3-2022.10-MacOSX-x86_64.pkg python版本:3.9.13 mac下安装cx_Oracle比较简单,直接打开终端 pip install cx_Oracle 二、安装Oracle客户端 直…

[ Linux ] 进程间通信介绍 管道

目录 0.进程间通信介绍 0.1通信背景 0.2进程间通信目的 1.管道 1.1 管道是什么 1.2 匿名管道 1.2.1管道通信的特点 1.2.2 匿名管道编码 父进程控制子进程的行为 进程池 -- 池化概念 1.3管道的特征总结 1.4命名管道 1.4.1创建一个命名管道 1.4.2 命名管道编码 0.进…

dump文件类型与dump文件生成方法详解

目录 1、概述 2、dump文件的分类 2.1、dump按大小分类 2.2、查看dump文件中函数调用堆栈中变量的值 3、调用SetUnhandledExceptionFilter设置异常处理回调函数,然后调用MiniDumpWriteDump生成dump文件 4、使用Google开源库CrashRpt捕获异常,并自动…

内网域环境搭建教程

搭建环境 win2012(DC):10.10.10.161 win2008 : 10.10.10.160 win7 : 10.10.10.157 环境配置 WIN2012域控机配置 将域控机配置成静态IP 更改计算机名 方便之后识别 安装域控制器和DNS服务 重启——安装 升级配置为域控制器 配置根域名为…

TOUGH2系列建模方法及在CO2地质封存、水文地球化学、地热、地下水污染等领域中的实践技术应用

TOUGH2系列软件是由美国劳伦斯伯克利实验室开发的,旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同,TOUGH2系列软件采用模块化设计和有限积分差网格剖分方法,通过配合不同EOS模块,软件…

[Geek Challenge 2022] crypto部分

这个比赛是一个网友让我看看的,这个比赛很有意思,crypto题全是百度网盘,pwn题全是谷歌网盘,这样我这pwn题就基本over了。还好这些crypto都不怎么难,都答出来了。最后成绩到10名了。 w_or_m? 第1个50分的题&#xff…

股票level2接口-API程序化文档说明

股票level2接口-API程序化文档说明,新手在API程序化上跟随老手进行。这是一种新的模式,适合那些想要而不知道如何投资正确项目的人。 股票level2接口TickRecord 逐笔说明(部分) 现在网络发展,使用组也很常见&#xff…