c++

简介: avl

一、AVL树的定义
AVL树,全称 平衡二叉搜索(排序)树。

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。

平衡因子(Balance Factor,简写为bf)
平衡因子(bf):结点的左子树的深度减去右子树的深度。也可以是右子树的深度减去左子树的深度。看个人实现而异。

即: 结点的平衡因子 = 左子树的高度 - 右子树的高度。
或者 节点的平衡因子 = 右子树的高度 - 左子树的高度。

AVL树本质上是一颗二叉查找树,但是它又具有以下特点:

它的左右子树都是AVL树
左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
这就是一颗AVL树

二、AVL树的作用
有一颗二叉树,他有n个节点,如果他是一颗二叉搜索树,他形状多样,可能会形成单枝树,高度为n,那么在这颗搜索树中查找元素的最坏时间复杂度为O(n),最好时间复杂度是O(l o g 2 n log_2 nlog
2

n)。
如果他是一颗AVL树,他的高度稳定为l o g 2 n log_2 nlog
2

n,查找元素的时间复杂度为O(l o g 2 n log_2 nlog
2

n)。
由上图可知,同样的结点,由于插入方式不同导致树的高度也有所不同。特别是在带插入结点个数很多且正序的情况下,会导致二叉树的高度是O(N),而AVL树就不会出现这种情况,树的高度始终是O(lgN).高度越小,对树的一些基本操作的时间复杂度就会越小。这也就是我们引入AVL树的原因。

三、AVL树的插入操作
插入——平衡因子的更新
在插入一个元素的时候,必然会引起平衡因子的变化,所以我们需要在插入的时候把平衡因子同时更新,在平衡因子大于1或者小于-1时,我们则需要进行旋转操作,进行调整,使平衡因子再次正常,从而保证这颗二叉树一直是一颗AVL树。

使用平衡因子计算: 右子树高度 - 左子树高度

情况一:

在插入元素后,需要更新父节点的平衡因子,在父节点的左子树插入元素,父节点的平衡因子-1,在父节点的左子树插入元素,父节点的平衡因子+1,如果父节点的平衡因子更新过后变为1或者-1,则需继续往上更新至根节点,因为1或者-1表示该节点的高度发生改变,需往上更新。

情况2:

在插入元素后,需要更新父节点的平衡因子,在父节点的左子树插入元素,父节点的平衡因子-1,在父节点的左子树插入元素,父节点的平衡因子+1,如果父节点的平衡因子更新过后变为0,则不需要继续向上更新,因为变为0只能说明该树高度没有变化,只是相对于原来变得平衡。

如果在更新平衡因子后,平衡因子不在(-1/0/1)范围时,则需旋转操作,下面讲解如何进行旋转操作

由于插入需要旋转的情况较多,大致可以分为四大类

插入——左单旋
动图演示

情况一
右子树高时,在右子树的右侧插入元素,此时需要左单旋

插入——右单旋
动图演示

情况二、
左子树较高时,在左子树的左侧插入元素,此时需要右单旋

插入——左右双旋
情况三、左子树较高时,在左子树的右侧插入元素,此时需要左右双旋,即:先对30进行左单旋,然后再对90进行右单旋

插入——右左双旋
情况四、右子树较高时,在右子树的左侧插入元素,此时需要右左双旋,即:先对90进行右单旋,然后再对30进行左单旋

相关文章
|
存储 弹性计算 编解码
阿里云赵大川:弹性计算推理解决方案拯救AIGC算力危机
阿里云弹性计算高级技术专家赵大川在【人工智能基础设施】专场中带来了题为《弹性计算推理解决方案拯救AIGC算力危机》的主题演讲,围绕弹性计算推理解决方案DeepGPU实例如何支持Stable Diffusion文生图推理、Stable Diffusion推理演示示例等相关话题展开。
70419 205
|
11月前
|
机器学习/深度学习 人工智能 运维
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
阿里云技术公开课预告:Elastic和阿里云搜索技术专家将深入解读阿里云Elasticsearch Enterprise版的AI功能及其在实际应用。
552 2
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
|
Python 容器
Python中的for循环用法详解,一文搞定它
Python中的for循环用法详解,一文搞定它
865 2
|
SQL 敏捷开发 Java
Springboot 整合tk-mybatis , 妈妈,我再也不想敲CRUD的代码了!
Springboot 整合tk-mybatis , 妈妈,我再也不想敲CRUD的代码了!
1433 0
Springboot 整合tk-mybatis , 妈妈,我再也不想敲CRUD的代码了!
|
存储 关系型数据库 MySQL
数据管理的艺术:PolarDB开源版详评与实战部署策略(一)
PolarDB-X是阿里巴巴自研的高性能云原生分布式数据库,基于共享存储的Shared-nothing架构,支持MySQL生态,具备金融级高可用、分布式水平扩展、HTAP混合负载等能力。它通过CN(计算节点)和DN(存储节点)实现计算与存储分离,保证数据强一致性,并支持全局二级索引和多主多写。PolarDB-X开源版提供更高程度的定制化和控制权,适合追求技术自主性和成本优化的开发者。部署方式包括RPM包、PXD工具和Kubernetes,其中PXD工具提供了一键部署的便利性。
237058 22
|
人工智能 算法 程序员
如何炼就 AI 原住民的“自我修养”丨通义灵码走进北京大学创新课堂
AI 时代的到来已成为不争的事实,当代大学生及年轻一代正成为这一新时代的原住民。10 月 11 日晚,通义灵码走进北京大学信息科学技术学院第二十六期“知存讲座”,阿里巴巴通义实验室算法专家、通义灵码算法负责人黎槟华先生受邀进行了以“AI 时代原住民的成长之路”为主题的报告。学院党委副书记贾方健主持了本次讲座。
|
人工智能 安全 数据挖掘
阿里云高级技术专家李鹏:AI基础设施的演进与挑战 | GenAICon 2024
阿里云高级技术专家、阿里云异构计算AI推理团队负责人李鹏将在主会场第二日上午的AI Infra专场带来演讲,主题为《AI基础设施的演进与挑战》。
|
内存技术
408王道计算机组成原理强化——中央处理器及大题解构(上)
408王道计算机组成原理强化——中央处理器及大题解构
1006 1
408王道计算机组成原理强化——中央处理器及大题解构(上)
|
存储 云计算
阿里云分布式存储Pangu团队招人啦
阿里云-飞天-盘古是阿里云自研的分布式存储平台,承接了整个阿里云的存储业务,拥有海量的用户。因业务需求增加,诚邀广大志同道合者加入。
7943 0
|
前端开发
Nestjs(五)异常处理方式(异常过滤器)
Nestjs(五)异常处理方式(异常过滤器)
334 0