从零开始学算法---二叉平衡树(AVL树)
先来了解一些基本概念:
1)什么是二叉平衡树?
之前我们了解过二叉查找树,我们说通常来讲, 对于一棵有n个节点的二叉查找树,查询一个节点的时间复杂度为log以2为底的N的对数。
通常来讲是这样的, 但是。。。有例外
比如,我们向一棵树中输入预先排好序的数据, 如1,2,3,4,5,。。。10000, 可以想象到,将形成一棵斜树那么查找10000就要经过9999次比较才能得到,这显然不是我们期望看到的
所以,我们希望引入一个约束条件----任何节点的深度不得过深。
这就是二叉平衡树
二叉平衡树是二叉查找树(排序树)的一种,其每一个节点的左子树和右子树的高度差最多为1

如上图, 左边两棵树并不是二叉平衡树, 因为节点58的左子树和右子树高度差>1。 (分别为2和3)
2)平衡因子?
二叉树上节点的左子树高度 减去 右子树高度, 得到的结果称为该节点的平衡因子
3)最小不平衡树?
当我们给一个二叉平衡树增加新的节点时,会产生最小不平衡树
以 距离插入节点最近的,平衡因子大于1的节点 为根的树, 我们称为最小不平衡树
如

了解了基本概念之后,我们来看看如何构建一棵二叉平衡树
来看一个例子,我们从初始的空AVL树开始插入3,2,1, 当插入1时, AVL的性质在根(3)处被破坏,此时,我们需要在根与其左儿子间实施单旋转以解决这个问题

我们继续插入节点4, 这没什么问题, 但当我们插入节点5时, AVL的性质在节点3处被破坏, 因此, 我们需要在节点3与其右儿子之间实施一次左旋来解决这个问题

现在我们再插入节点6,此时AVL的性质在根节点(2)处被破坏, 因此我们在根节点和其右节点4之间实施一次左旋

左旋的结果是 4成为根节点,2成为4的左儿子, 4 原本的左儿子3成为2的右儿子
现在再插入节点7, 此时AVL的性质在节点5处被破坏, 因此我们在5节点和其右节点6之间实施一次左旋

根据上面的操作,我们现总结处两条规律:(太绕口,不用记,看图能理解就可以)
假设当我们插入新节点时,导致了原AVL树在节点 p 处不平衡,那么
1)如果添加的新节点是p的左儿子的左儿子, 则在p和其左儿子之间实施一次右旋转, p变成其左儿子的右儿子(如果其左儿子原本已经有右儿子, 则原本的右儿子成为p的左儿子)
2)如果新加的节点是p的右儿子的右儿子, 则在p和其右儿子之间实施一次左旋转,p变成其右儿子的左儿子(如果其右儿子原本已经有左儿子, 则原本的左儿子成为p的右儿子)
感觉头都转晕了
but...真正复杂的还在后面。。。。。。。。
现在我们给上面的二叉树插入节点16,这没什么问题, 再插入15, 此时二叉树在节点7处不再平衡,这时我们发现单旋转已经不能解决问题了, 如果只是在7和16之间左旋的话,15将成为16的右节点,这显然不符合二叉排序树的性质。
因此这里我们需要两次旋转,先在15和16之间进行一次右旋,右旋之后就满足了上文规律2)的条件,此时再进行一次左旋

现在我们再插入14, 跟上面情况类似,插入之后需要执行先右旋再左旋的操作

现在让我们再做个小结,
当我们插入新节点时,导致了原AVL树在节点 p 处不平衡,那么
3)如果添加的新节点是p的右儿子的左儿子, 则先在其右儿子和右儿子的左儿子之间实施一次右旋转, 再在p和其右儿子之间实施一次左旋转
3)如果添加的新节点是p的左儿子的右儿子, 则先在其左儿子和左儿子的右儿子之间实施一次左旋转, 再在p和其左儿子之间实施一次右旋转
再高度总结下: 同向时单旋转,异向时双旋转
原理就到这里了, 代码实现比较复杂,这里就不再写了,个人觉得没有必要,因为AVL树是最古老的平衡树, 我们了解其原理是为了下一步----更好的理解红黑树。
从零开始学算法---二叉平衡树(AVL树)的更多相关文章
- (4) 二叉平衡树, AVL树
1.为什么要有平衡二叉树? 上一节我们讲了一般的二叉查找树, 其期望深度为O(log2n), 其各操作的时间复杂度O(log2n)同时也是由此决定的.但是在某些情况下(如在插入的序列是有序的时候), ...
- Algorithms: 二叉平衡树(AVL)
二叉平衡树(AVL): 这个数据结构我在三月份学数据结构结构的时候遇到过.但当时没调通.也就没写下来.前几天要用的时候给调好了!详细AVL是什么,我就不介绍了,维基百科都有. 后面两月又要忙了. ...
- 树-二叉搜索树-AVL树
树-二叉搜索树-AVL树 树 树的基本概念 节点的度:节点的儿子数 树的度:Max{节点的度} 节点的高度:节点到各叶节点的最大路径长度 树的高度:根节点的高度 节点的深度(层数):根节点到该节点的路 ...
- 二叉平衡树AVL的插入与删除(java实现)
二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...
- 树-二叉平衡树AVL
基本概念 AVL树:树中任何节点的两个子树的高度最大差别为1. AVL树的查找.插入和删除在平均和最坏情况下都是O(logn). AVL实现 AVL树的节点包括的几个组成对象: (01) key -- ...
- 高度平衡的二叉搜索树(AVL树)
AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...
- 各种查找算法的选用分析(顺序查找、二分查找、二叉平衡树、B树、红黑树、B+树)
目录 顺序查找 二分查找 二叉平衡树 B树 红黑树 B+树 参考文档 顺序查找 给你一组数,最自然的效率最低的查找算法是顺序查找--从头到尾挨个挨个遍历查找,它的时间复杂度为O(n). 二分查找 而另 ...
- AVL树(二叉平衡树)详解与实现
AVL树概念 前面学习二叉查找树和二叉树的各种遍历,但是其查找效率不稳定(斜树),而二叉平衡树的用途更多.查找相比稳定很多.(欢迎关注数据结构专栏) AVL树是带有平衡条件的二叉查找树.这个平衡条件必 ...
- java项目---用java实现二叉平衡树(AVL树)并打印结果(详)(3星)
package Demo; public class AVLtree { private Node root; //首先定义根节点 private static class Node{ //定义Nod ...
随机推荐
- Verilog实例数组
编写 Verilog 代码多年,至今才无意中发现了一种奇怪的语法,估计见过的这种的写法的人,在 FPGA 开发者中不会超过 20% 吧. 直接来看代码吧.先定义了一个简单的模块,名为 mod. mod ...
- 一文彻底弄懂this关键字用法
哈喽,大家好,我是指北君. 介绍完 native.static.final 关键字后,指北君再接再厉,接着为大家介绍另一个常用的关键字--this. this 也是Java中的一个关键字,在<J ...
- TypeScript 中枚举类型的理解?应用场景?
一.是什么 枚举是一个被命名的整型常数的集合,用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说,枚举就是一个对象的所有可能取值的集合 在日常生活中也很常见,例如表 ...
- 整理之Service
Service 基础 一个Service的基本结构 class MyService : Service() { private val mBinder = MyBinder() override fu ...
- noip模拟38
\(\color{white}{\mathbb{深秋总有廖落处,雁归每是菊败时,名之以:残菊}}\) 这场比赛几乎全场都在打暴力,几乎人均切掉的 \(t1\) 没有想到双指针,\(t3\) 的暴力也没 ...
- adb 常用命令大全(4)- 应用管理
查看应用列表 语法格式 adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] ...
- VUE005. 在data中使用 / 改变data,或在data中调用method函数
使用三方UI库时经常会遇到在data中写入方法的场景,如Element-UI的级联选择器(动态加载part)需要在data中写入lazyLoad. 但后端总会给出意想不到的需求: 通过接口调取一串数据 ...
- 马哈鱼数据血缘分析器分析case-when语句
马哈鱼数据血缘分析器是一个分析数据血缘关系的平台,可以在线直接递交 SQL 语句进行分析,也可以选择连接指定数据库获取 metadata.从本地上传文件目录.或从指定 git 仓库获取脚本进行分析. ...
- activemq启动错误UnsupportedClassVers rg/apache/activemq/console/Main:Unsupported major.minor version52.0
ActiveMQ与java的JDK是有版本对应匹配的. 下面提供一个匹配图: MQ版本号 Build-Jdk 依赖JDKapache-activemq-5.0.0 1.5.0_12 1.5+apach ...
- go的database/sql库中db.Exce()
db.Exec(query string, args ...interface{}) Db.Exec(`CREATE TABLE IF NOT EXISTS STU(ID int(8) PRIMARY ...