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进行左单旋

相关文章
|
7月前
|
人工智能 物联网 PyTorch
SCEdit:轻量级高效可控的AI图像生成微调框架(附魔搭社区训练实践教程)
SCEdit是一个高效的生成式微调框架,由阿里巴巴通义实验室基础视觉智能团队所提出。
|
人工智能 语音技术
技术沙龙|3D-Speaker说话人识别多模型解析
技术沙龙|3D-Speaker说话人识别多模型解析
326 0
|
人工智能 自动驾驶 云栖大会
2023云栖大会首日干货全览!
2023云栖大会首日干货全览!
55651 3
|
7月前
|
机器学习/深度学习 人工智能 云计算
展望技术圈的2024:技术革新的未来趋势
在过去的2023这一年,我们见证了技术圈许多令人印象深刻的技术创新,它们不断改变着我们的工具和工作方式,也让我们混迹于技术圈的这些普通开发者们看到了技术创新带来的新挑战和新机遇,虽然时间一去不复返,但是技术是随着时间的推移而不断进步和完善,这也是我们唯一值得期待的事情。而当我们展望2024年,作为技术潮流前沿的开发者,我们不禁思考哪些技术将在未来迎来新的革命,哪些技术又是我们程序开发者的新的希望。那么本文就来简单分享一下可能的技术发展趋势,其中包括人工智能与机器学习的进一步发展以及云计算领域可能出现的变革,and so on。
238 2
展望技术圈的2024:技术革新的未来趋势
|
Cloud Native IDE 中间件
活动回顾丨云原生技术实践营北京站回放 & PPT 下载
活动回顾丨云原生技术实践营北京站回放 & PPT 下载
938 13
|
7月前
|
边缘计算 供应链 安全
|
架构师 安全 云栖大会
2023云栖大会新品发布 | 无影2.0年度发布
无影2.0全新升级,基于阿里云底座及无影产品原子化能力,通过工具层、架构层、应用层的全方位焕新设计,重磅推出无影企业云、无影云办公室、无影云Flow等解决方案,打造开放互联、万物互动云视界。
346 0
2023云栖大会新品发布 | 无影2.0年度发布
|
存储 大数据 Serverless
限时领票|走进 2023 · 云栖大会,看大咖对话开源
2023 云栖大会来啦,大数据与数据分析、开源技术等众多主题活动与你同聚,门票免费领取中,数量有限,先到先得!
374 0
限时领票|走进 2023 · 云栖大会,看大咖对话开源
|
人工智能 运维 Kubernetes
带你读《云原生架构白皮书2022新版》——云原生技术中台 CNStack 产品家族
带你读《云原生架构白皮书2022新版》——云原生技术中台 CNStack 产品家族
461 13