AVL右旋转思路分析与图解
AVL树右旋转思路分析与图解
其实我们前面讲过了左旋转之后再学习右旋转就会非常的简单了, 因为我们的右旋转相对我们的左旋转只是换了一个方向而已, 那么下面我们就来讲解右旋转的实现
对于数列{10, 12, 8, 9 ,7, 6} , 当我们插入6的时候leftHeight() - rightHeight() > 1成立(也就是此时的树成为了一颗不平衡树, 并且这个时候我们观察构成的AVL树之后我们可以发现此时的最小不平衡子树是一个LL型的不平衡子树), 所以这个时候我们就要采用某种操作让这个不平衡的树重新平衡起来, 那么我们要如何处理之后可以让这个树重新平衡起来?
因为这时候的最小不平衡子树是一个LL型最小不平衡子树, 所以我们此时只要对这个最小不平衡子树的根节点执行一个右旋转即可完成平衡化处理:
那么如何实现右旋转? 我们这里通过图解来进行描述:
右旋转的具体实现过程:
- 创建一个新的结点newNode, 值等于当前最小不平衡二叉树根节点的值
- 让新结点newNode的右子结点指向当前根节点的右子树
- 让新结点的左子节点指向当前根节点的左子节点的右子树
- 让当前根节点的值换为当前根节点的左子节点的值
- 因为右旋的时候旧根节点的左子结点的值就是我们的新根节点值
- 把根节点的左子树设置为当前根节点的左子树的左子树( 将原本存储新根节点值的结点从树中删除掉)
- 把根节点的右子树设置为新结点
注意: 整个过程中根节点是没有变的, 只是根节点的值发生了改变
右旋的核心思想: (两步)
- 原本旧根结点为现在新根节点的右子树
- 原本新根节点的右子树变为现在旧根结点的左子树
这里我们来对左旋和右旋进行一个易错归纳(我们以左旋为例):
- 对于如下结构的左旋到底是如何实现的:
- 首先我们要知道上图的最小不平衡子树并不是整棵树, 而是如下的子树:
所以我们最终应该是对这个最小不平衡子树的根节点执行一个左旋的操作, 因为此时的最小不平衡子树显然是一个RR型最小不平衡子树, 最终这个最小不平衡子树会变成如下:
这个时候我们要注意: 我们的根节点一直没有变化过, 这个时候只是原本的根节点的值从3变为了4, 但是节点并没有发生变化, 所以也就是这个最小不平衡子树一直没有和整个树断开连接, 因为根节点始终没有变过, 所以最终平衡之后就会是如下:
最终得到了如上的平衡二叉树, 我们的平衡化就算是完成了, 但是这个时候有的人会提出一个思路: 就是我们可不可以通过改变指针的指向, 不用创建新的结点来完成这次左旋操作?(比如说改变②结点的指向, 直接让②结点指向④结点)
- 答案是不建议的(我们一般不这么做), 因为最终左旋操作是在递归中执行的, 最终我们是会拿到最小生成树的根节点, 也就是④结点, 所以我们无法改变②结点的指向, 如果我们非要拿到②结点肯定也是可以的, 但是这样的算法的效率可能就不会太高 —> 所以我们建议的就是通过建立一个新的节点的方式来完成, 这样的效率是比较高的, 并且实现起来的思路也比较简单
左旋和右旋其实就是一个针对RR型和LL型最小不平衡子树的平衡算法, 这个算法的核心是(我们以左旋为例): 降低最小不平衡子树的根节点的右子树的高度
这里我们其实就是将最小不平衡子树的右子树的高度降低了1, 然后将最小不平衡子树的左子树的高度加了1
而我们要降低最小不平衡子树的根节点的右子树的高度, 肯定是要通过变动二叉树结构来实现, 所以我们其实只需要知道如何变动即可:
我们只需要让最小不平衡子树的根节点的值变为根节点右子节点的值, 然后做了这一步操作之后树中的结构以及元素每个值的元素的个数都会不平衡, 所以我们只需要通过一系列操作之后重新让树平衡起来, 这样的算法就是**“左旋算法”**
上面只是一种实现: 我们是先将原本的根节点保存下来, 然后通过改变根节点的值实现的左旋, 这种实现的好处就是根节点并没有变化, 所以最小不平衡子树和整个不平衡树并没有失去连接, 这种方式比较好操作, 好理解.
AVL右旋转思路分析与图解相关推荐
- 易语言高级表格写入MYSQL_易语言数据库与高级表格思路分析.doc
易语言数据库与高级表格思路分析 篇一:易语言数据库操作指南 易语言数据库操作指南 一.易语言操作Access数据库 前面我们已经对比分析过易语言所支持的几种常见数据库,在这几种数据库中,我们先来学习一 ...
- 冒泡排序算法(思路分析) [数据结构][Java]
冒泡排序算法(思路分析) 基本介绍: 冒泡排序(Bubble Sorting)的基本思想是: 通过对 "待排序序列" 从前向后一次比较相邻元素的值,若发现逆序则交换,使值较大的元素 ...
- iOS-组件化 —— 路由设计思路分析
iOS 组件化 -- 路由设计思路分析 一缕殇流化隐半边冰霜2017-03-01 10:48:3117066 原文 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各 ...
- iOS 组件化,插件化,模块化设计思路分析
iOS 组件化,插件化设计思路分析 前言 随着用户的需求越来越多,对App的用户体验也变的要求越来越高.为了更好的应对各种需求,开发人员从软件工程的角度,将App架构由原来简单的MVC变成MVVM,V ...
- 希尔排序算法(思路分析) [数据结构][Java]
希尔排序算法(思路分析) 希尔排序也称之为: 缩小增量排序 希尔排序提出的背景: 因为简单插入排序中存在一些问题( 这里我们以升序排序为例 ): 当我们要待插入的数值比较小时后移的次数明显增多,对效率 ...
- pd.merge 结果出现重复_COUNTIFS函数技巧之去重复值计数(思路分析,过程详解)...
各位读者朋友们大家好,今天给大家介绍COUNTIFS函数的技巧性用法一,去除重复值计数.何为去除重复值计数呢?简单来说,当我们的数据源中存在重复值时,而我们只想将重复值计算一次,来计算不重复的项目有多 ...
- AT解析层的思路分析及代码实现
文章目录 1 AT解析层的思路分析 1.1 AT解析层的接口API分析 1.2 AT解析层代码流程 2 AT解析层代码实现 2.1 代码实现 1 AT解析层的思路分析 1.1 AT解析层的接口API分 ...
- 按键驱动的思路分析和代码实现
文章目录 1 按键驱动的思路分析 2 按键驱动的代码实现 1 按键驱动的思路分析 为了方便实现低功耗,我们的按键需要使用外部中断实现,实现的流程如下: 按键检测状态机如下: 2 按键驱动的代码实现
- SpringSecurity分布式整合之实现思路分析
JWT相关工具类 jar包 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt ...
最新文章
- 为什么百度首页的HTML源代码最后一行要多一行?浪费空间呀!
- dz mysql日志清理_Discuz教程:如何准确的清理数据库
- 如何用pip指令将python包安装到虚拟环境中
- 形式化方法、《大象:Thinking in UML》
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- Beautifulsoup 网页表格的解析
- 2020下半年python二级考试时间_2020年下半年计算机等级考试报名通知
- H3C——路由策略和策略路由实例配置
- django 笔记17 ModelForm
- JSTL和EL的使用
- 7、编译安装LAMP之apache与PHP整合
- [转载] python-numpy总结
- 通向架构师的道路(第八天)之weblogic与apache的整合与调优 转
- linux网络子系统分析(一)——协议栈分层实现综述
- Docker学习(四)Docker镜像原理 镜像commit操作补充
- dynamic动态添加属性
- Bypassing JavaScript Filters – the Flash! Attack
- linux如何把文件导出到ftp,Linux如何利用ssh传送文件至FTP空间
- Win10 下搭建PHP开发环境(自定义方式)
- plt_iris Matplotlib画图参数 Numpy 莺尾花演示