AVL树的旋转操作详解
【0】README
0.0) 本文部分idea 转自:http://blog.csdn.net/collonn/article/details/20128205
0.1) 本文仅针对性地分析AVL树的单旋转(左左单旋转和右右单旋转)和 双旋转(左右双旋转和右左单旋转)的内部核心技巧;
0.2) 不得不提的是,旋转有两个属性: 轴 和 旋转方向; (旋转轴即是原最小树经过旋转修正后的符合AVL的最小树的根节点)
0.3) 旋转轴的确定 : (干货——单双旋转的旋转轴确定问题)
- 0.3.1)单旋转:旋转轴为 不满足AVL条件的最小树的树根的相应孩子节点;
- 0.3.2)多旋转:旋转轴为 不满足AVL条件的最小树的树根的相应孙子节点;
- 0.3.3) for updated source code , please visit https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter4/p80_AVL_last
0.4) for basic AVL info , please visit http://blog.csdn.net/PacosonSWJTU/article/details/49365415
【1】 如何判断进行单旋转还是双旋转 (干货——什么时候需要单旋转,而什么时候需要多旋转?)
1.1)单旋转: 插入点不介于 不满足AVL条件的树根 和 树根对应孩子节点之间;
1.2)双旋转:插入点介于 不满足AVL条件的树根 和 树根对应孩子节点之间;
【2】单旋转
2.1)左左旋转(顺时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;
- case1)
| (这是一个左右双旋转特例,当不符合AVL条件的树根和插入点的父节点只有一个子节点,且相反方向的子节点,当然了,插入点要介于树根和插入点父节点之间的话,才满足 双旋转特例的条件) |
Attention)
A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成;
(干货:也即是, 左左单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管 该树的左子树的右孩子 或者存在 或者 不存在,在旋转过程中,都要把该左子树的的右孩子添加以作为最小树根的左孩子,因为即使不存在,添加null 也不影响最后的旋转效果)case2)
2.2)右右旋转(逆时针旋转): 从插入点回溯到第一个不满足AVL条件的节点;本例中,插入点是10, 而第一个不满足AVL条件的节点是30;将回溯路径上的节点除节点30外,上移一层,节点30下移一层;
- case1
(这是一个右左双旋转特例,当不符合AVL条件的树根和插入点的父节点只有一个子节点,且相反方向的子节点,当然了,插入点要介于树根和插入点父节点之间的话,才满足 双旋转特例的条件)
Attention)
A1)因为10 小于 20 且 小于30; 所以通过一次单旋转就可以完成;
(干货:也即是, 右右单旋转时, 不满足AVL条件的最小树的根应该下移,该树的其他节点上移,而不管 该树的右子树的左孩子 或者存在 或者 不存在,在旋转过程中,都要把该右子树的左孩子添加以作为最小树根的右孩子,因为即使不存在,添加null 也不影响最后的 旋转效果)case2)为什么经过右右单旋转就可以修正成为 AVL 树;因为 new point = 13 不在 4 和 7 之间, 所以一次单旋转就可以了,无需双旋转;
(干货——也就是说,new point 介于 不满足AVL条件的树根 和 其 孩子 之间的话,那么就需要双旋转, 否则, 只需要 单旋转就可以了)
Conclusion of single rotation)单旋转有两个属性: 轴 和 旋转方向
C1)单旋转的轴: 相信你也看到了, 单旋转的轴显然是不符合AVL条件的树根的直接孩子;
- C1.1)左左单旋转的轴:是不符合AVL条件的树根的左孩子;
- C1.2)右右单旋转的轴:是不符合AVL条件的树根的右孩子;
C2)旋转方向:
- C2.1)左左单旋转方向:顺时针方向;
- C2.2)右右单旋转方向:逆时针方向;
【3】双旋转
3.1)左右双旋转: (先左左单旋转,再右右单旋转; 即先顺时针旋转,后逆时针旋转)
- case1)因为47 介于 40 和 50 之间, 所以肯定需要双旋转;
3.2)右左双旋转:先将节点15向上提,还是不满足AVL树的条件,再把节点7向上提;(先右右单旋转,再左左单旋转; 即先逆时针旋转,后顺时针旋转)
Conclusion of double rotations) 双旋转有两个属性: 轴 和 旋转方向
C1)双旋转的轴:相信你也看到了, 双旋转的轴显然是插入点的直接父节点;(除了两个特例) (干货——双旋转的轴显然是插入点的直接父节点(除了两个特例, 而两个特例的轴是插入点本身))
- C1.1)左右单旋转的轴:插入点的父节点;
- C1.2)右左单旋转的轴:插入点的父节点;
C2)旋转方向:
- C2.1)左右单旋转方向:先右右单旋转,再左左单旋转;即先逆时针旋转,再顺时针旋转;
- C2.2)右左单旋转方向:先左左单旋转,再右右单旋转;即先顺时针旋转,再逆时针旋转;
AVL树的旋转操作详解的更多相关文章
- AVL树(二叉平衡树)详解与实现
AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...
- AVL树的JAVA实现及AVL树的旋转算法
1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡.而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1. ...
- AVL树平衡旋转详解
AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...
- 数据结构-AVL树的旋转
http://blog.csdn.net/GabrieL1026/article/details/6311339 平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它 ...
- SVN的Windows和Linux客户端操作详解
SVN的Windows和Linux客户端操作详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Windows客户端操作 1.安装SVN客户端 a>.去官网下载svn软件 ...
- c++排序二叉树的出现的私有函数讨论,以及二叉树的删除操作详解
c++排序二叉树的出现的私有函数讨论, 以及二叉树的删除操作详解 标签(空格分隔): c++ 前言 我在c++学习的过程中, 最近打了一个排序二叉树的题目,题目中出现了私有函数成员,当时没有理解清楚这 ...
- MongoDB各种查询操作详解
这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下 一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...
- Linux Shell数组常用操作详解
Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
随机推荐
- 《经久不衰的Spring框架:Spring+SpringMVC+MyBatis 整合》
前言 主角即Spring.SpringMVC.MyBatis,即所谓的SSM框架,大家应该也都有所了解,概念性的东西就不写了,有万能的百度.之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目 ...
- Java重写equals()和hashCode()
1.何时需要重写equals() 当一个类有自己特有的 ”逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查 ”实参是否为正确的类型”. [2 ...
- 初始Django
Django概述 Django是什么 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C. Django的主要目标是使得开发复杂的 ...
- Linux的capability深入分析
Linux的capability深入分析详见:http://blog.csdn.net/u014338577/article/details/48791953 lxd中对容器能力的限制: 普通用户不能 ...
- 【2017-02-21】分支语句if...else...、分支嵌套、变量的作用域
语句是指程序命令,都是按照顺序执行的. 语句又分为: 顺序语句:从上到下按顺序执行,挨个执行一遍. 分支语句:选择性执行语句,有的可能会执行,有的可能不执行.满足条件执行. 循环语句: 一.分支语句 ...
- 【2017-2-17】C#基础 - 定义变量,输入输出
1.初学C#. C#是专门为.NET的应用而开发的语言,他吸收了C++.Visual Basic.Delphi.Java等语言的优点,提高了程序开发的效率. 2.Visual Studio.NET的集 ...
- MyFirstServlet学习笔记
MyFirstServlet学习笔记 项目文件的结构目录如下,ser包,下设Serv.java是一个servlet文件,Note只是做的笔记,webroot下有login.jsp,WEB-INF下有w ...
- js手写图片查看器(图片的缩放、旋转、拖拽)
在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...
- Https握手协议以及证书认证
1. 什么是https Https = http + 加密 + 认证 https是对http的安全强化,在http的基础上引入了加密和认证过程.通过加密和认证构建一条安全的传输通道.所以https可以 ...
- 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型
MNIST 被喻为深度学习中的Hello World示例,由Yann LeCun等大神组织收集的一个手写数字的数据集,有60000个训练集和10000个验证集,是个非常适合初学者入门的训练集.这个网站 ...