AVL树的介绍和实现

news2025/7/27 17:17:00

我们知道,二叉搜索树是会出现单向的。单向在查找时效率是非常低的,时间复杂度会退化成O(N),而AVL树就是解决这个问题
在这里插入图片描述

文章目录

  • 1. AVL 树
    • 1.1 AVL树的概念
    • 1.2 AVL树节点的定义
    • 1.3 插入后的平衡因子
    • 1.4 AVL树的旋转
      • 1.4.1 右右:左单旋
      • 1.4.2 左左:右单旋
      • 1.4.3 左右:先左单旋再右单旋
      • 1.4.4 右左:先右单旋再左单旋
    • 1.5 AVL树的验证
    • 1.6 AVL树的性能

1. AVL 树

1.1 AVL树的概念

概念:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右
子树高度之差的绝对值不超过1(需要对树中的结点进行调整)。

性质:1. 它的左右子树都是AVL树。2. 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)

1.2 AVL树节点的定义

在这里插入图片描述
AVL树并没有规定必须要设计平衡因子,只是一个实现的选择,方便控制平衡。

1.3 插入后的平衡因子

首先,我们还是按照之前插入的方式:
在这里插入图片描述

这里主要是插入的父结点要更新。
那么一个新结点插入树中后,它的平衡因子怎么变化(是右子树-左子树为例),我们来看:
在这里插入图片描述
我们在9的左边插入一个新结点,哪些平衡因子会发生变化呢?
在这里插入图片描述
我们可以看到,需要改变的是插入结点的祖先。其余结点不需要改变。
每个祖先的平衡因子如果改变成1或者-1,说明原来是0,子树的高度发生了变化,需要继续往上更新。
在这里插入图片描述
此时,父亲的平衡结点为0。说明parent为根的树高度不变,不需要在往上更新了。
在这里插入图片描述
这里parent的平衡因子变成了2,违反了AVL树的规则,就不需要再往上更新了,我们要旋转子树。

基本规则如下:
1.子树高度变了,就继续往上更新。
2.子树高度不变,就完成更新。
3.子树违反平衡规则,就旋转子树。

代码实现:
在这里插入图片描述

1.4 AVL树的旋转

根据节点插入位置的不同,AVL树的旋转分为四种:

1.4.1 右右:左单旋

1. 新节点插入较高右子树的右侧—右右:左单旋
在这里插入图片描述
左单旋是将60的左边放到30的右边,然后将30放到60的左边。

代码实现思路:
我们先将我们要修改的位置给标记上:
在这里插入图片描述
我们用parent,SubR,SubRL来标记我们要修改的结点。我们可以根据上图来分析,parent改到SubR的左边,SubRL改到parent的右边。
在这里插入图片描述
还有我们要把三叉链中的父指针更新:
在这里插入图片描述
这里我们还要注意:SubRL可能为空,所以我们需要加一个判断。
在这里插入图片描述
到这里了,还是没有结束。因为parent可能是根,也可能不是根。
在这里插入图片描述
这是parent不为根且SubRL为空的情况,旋转之后为:
在这里插入图片描述
我们需要将7和9(SubR)连起来。
在这里插入图片描述
左单旋的平衡因子:
在这里插入图片描述
从上图我们可以看出,只有parent和SubR的平衡因子发生了变化。SubRL的高度并没有发生改变。
在这里插入图片描述
从上图也可以看出,当parent的平衡因子为2,cur的平衡因子为1时。就会发生左单旋。
在这里插入图片描述

1.4.2 左左:右单旋

2. 新节点插入较高左子树的左侧—左左:右单旋
在这里插入图片描述
这里把30的右边转到60的左边,然后把60转到30的右边。

代码实现思路:
还是要将修改的位置给标记上:
在这里插入图片描述
我们将SubLR放到parent的左边,把parent放到SubL的右边。其余和上面的左单旋类似。

在这里插入图片描述
在这里插入图片描述

1.4.3 左右:先左单旋再右单旋

3. 新节点插入较高左子树的右侧—左右:先左单旋再右单旋

什么是较高左子树的右侧?
在这里插入图片描述
在这里插入图片描述
当然在b插入或者c插入都会引起这种情况。

那么我们该怎么旋转呢?
在这里插入图片描述
在这里插入图片描述
将双旋变成单旋后再旋转,即:先对30为根进行左单旋,然后再对90为根进行右单旋。

但是还有一种平衡因子变化,没有考虑到
因为h为0的时候,平衡因子不一样了。
在这里插入图片描述虽然有三种平衡因子的情况,但是旋转的方法都是一样的。

那么我们该怎么区分这三种情况呢
答案是:观察60这个结点的平衡因子

代码实现:
在这里插入图片描述
我们还是先给这三个位置标记上。
在这里插入图片描述
但是此时我们左旋转和右旋转后,树的平衡因子被打乱了。我们需要重新更新平衡因子。根据上图的三种情况来更新,会比较容易。
在这里插入图片描述
在这里插入图片描述

1.4.4 右左:先右单旋再左单旋

4. 新节点插入较高右子树的左侧—右左:先右单旋再左单旋。

那么这个情况和上一种类似,我们直接来看图:
在这里插入图片描述
将双旋变成单旋后再旋转,即:先对90为根进行右单旋,然后再对30为根进行左单旋。

代码实现:
在这里插入图片描述
在这里插入图片描述

1.5 AVL树的验证

在这里插入图片描述
在这里插入图片描述

1.6 AVL树的性能

AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度。但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。因此:如果需要一种查询高效且有序的数据结构,而且数据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修改,就不太适合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript 循环实例集合

文章目录JavaScript 循环实例集合For 循环循环输出 HTML 标题While 循环Do while 循环break 语句continue 语句使用 For...In 声明来遍历数组内的元素JavaScript 循环实例集合 For 循环 源码 <!DOCTYPE html> <html> <head> <meta charset"utf-8&q…

PG数据库入门知识

前言 Linux和windows的路劲分隔符是不同的&#xff0c;Linux下是斜杠/,而windows是反斜杠&#xff08;\&#xff09;。但在PG里window下也要使用linux的/作为路劲分隔符。 基础知识 为什么选择PG PostgreSQL是一款企业级关系型数据库管理系统。PostgreSQL之所以如此特别&am…

如何成为程序员中的牛人/高手?

目录 一、牛人是怎么成为牛人的&#xff1f; 二、关于牛人的一点看法 三、让程序员与业务接壤&#xff0c;在开发团队中“升级” 四、使用低代码平台 目标效果 五、最后 祝伟大的程序员们梦想成真、码到成功&#xff01; 一、牛人是怎么成为牛人的&#xff1f; 最近在某…

Android开发学习—手机开机启动的AMS流程

前言 AMS是Android中最核心的服务&#xff0c;主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作&#xff0c;其职责与操作系统中的进程管理和调度模块相类似&#xff0c;因此它在Android中非常重要。 客户端使用ActivityManager类。由于AMS是系统核心服…

浅谈ChatGPT 和 对AI 的思考

新世纪以来&#xff0c;人工智能作为一个非常热门话题&#xff0c;一直收到大众的广泛的关注。从一开始的图像的分类&#xff0c;检测&#xff0c;到人脸的识别&#xff0c;到视频分析分类&#xff0c;到事件的监测&#xff0c;到基于图片的文本生成&#xff0c;到AI自动写小说…

机器学习-卷积神经网络CNN中的单通道和多通道图片差异

背景 最近在使用CNN的场景中&#xff0c;既有单通道的图片输入需求&#xff0c;也有多通道的图片输入需求&#xff0c;因此又整理回顾了一下单通道或者多通道卷积的差别&#xff0c;这里记录一下探索过程。 结论 直接给出结论&#xff0c;单通道图片和多通道图片在经历了第一…

QUIC 多流桥接、新增 DDS 协议转换代理

驽马十驾&#xff0c;功在不舍。新春之交&#xff0c;NanoMQ 继续保持稳步更新&#xff0c;最新的 0.16 版本将于三月初发布。NanoMQ 为用户提供了 2 个重要新功能&#xff1a;MQTT over QUIC 的多流桥接和 DDS 协议转换代理&#xff0c;拓宽了 NanoMQ 的弱网桥接传输性能和在边…

08 CSS05

目标&#xff1a; 1、定位 2、装饰 3、选择器拓展 一、定位 1、定位的基本介绍 2、定位的基本使用 3、静态定位 4、相对定位 5、绝对定位 6、子绝父相 7、固定定位 8、元素的层级关系1、定位的基本介绍 1.1 网页常见布局方式 &#xff08;1&#xff09;标准流 块级元素独…

CVTE前端面经(2023)

CVTE前端面经项目介绍&#xff08;重点&#xff09;在数据B中找到数组A对应的值&#xff0c;并把数组B对应的值放在数据最前面css1 定位2 外边距3 css高级应用3.1. 过渡3.2. 变形2. 浮动2.1 浮动元素特点2. 2 清除浮动3. html5语义标签4. 实现圣杯布局的两种方式4.1 定位浮动4.…

不会吧,难道真的有程序员不知道怎么接单赚钱吗?

随着大环境逐渐转好&#xff0c;跳槽、新工作、兼职等等机会都浮出水面。抛开跳槽、新工作不谈&#xff0c;今天就专门来说说程序员接单赚钱有哪些靠谱的平台。 首先分享一波关于接私活有哪些注意事项&#xff0c;给大家提个醒&#xff0c;避免盲目入坑。 一、程序员接单须知…

搬得进来,搬得出去!快来过一把数据迁移的“瘾”

欢迎访问OceanBase官网获取更多信息&#xff1a;https://www.oceanbase.com/ 经过前几次“剧透”&#xff0c;我们知道了 OceanBase 开发者大会有嘉宾、有演讲&#xff0c;有开源生态专场&#xff0c;也知道我们还会有 3 场 Hands-on Workshop 动手实验营&#xff0c;从部署到…

从LiveData迁移到Kotlin的 Flow,才发现是真的香!

LiveData 对于 Java 开发者、初学者或是一些简单场景而言仍是可行的解决方案。而对于一些其他的场景&#xff0c;更好的选择是使用 Kotlin 数据流 (Kotlin Flow)。虽说数据流 (相较 LiveData) 有更陡峭的学习曲线&#xff0c;但由于它是 JetBrains 力挺的 Kotlin 语言的一部分&…

一文搞定!postman接口自动化测试【附项目实战详解】

目录&#xff1a;导读 | 接口结果判断 功能区 脚本相关 代码模板 | 集合(批量)测试 变化的参数数据 定期任务 接口执行顺序 数据传递 | 解决依赖问题 假设场景 Postman 中的操作 运行 写在最后 附带项目实战教程地址&#xff1a;postman接口自动化测试使用教程项…

[计算机组成原理(唐朔飞 第2版)]第一章 计算机系统概论 第二章 计算机的发展及应用(学习复习笔记)

第1章 计算机系统概论 1.1 计算机系统简介 1.1.1 计算机的软硬件概念 计算机系统由“硬件”和“软件”两大部分组成。 硬件 是指计算机的实体部分&#xff0c;它由看得见摸得着的各种电子元器件&#xff0c;各类光、电、机设备的实物组成如主机、外部设备等 软件 软件看不见…

【protoc自定义插件】「go语言」实现rpc的服务映射成http的服务,protoc生成gin的插件,(详解实现原理及过程)

文章目录前言一、工程实践中如何更好的使用proto文件&#xff1f;二、protoc命令如何查询依赖的proto文件以及执行原理1. protoc命令如何查询依赖的proto文件2. protoc执行的插件加载原理是什么&#xff1f;3. proto文件中的package和go_package的作用三、protoc插件开发原理体…

春招冲刺(十): Vue2 技术复盘

vue2 技术复盘 Q1&#xff1a;MVVM框架的理解&#xff1f; MVVM模型&#xff1a; M&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;data中的数据V&#xff1a;视图&#xff08;View&#xff09;&#xff0c;模板代码VM&#xff1a;视图模型&#xff08;ViewModel…

Me-and-My-Girlfriend-1靶场通关

Me-and-My-Girlfriend-1靶场通关 靶机ip:192.168.112.135 信息收集 端口&#xff1a;22、80 还是从80WEB服务器端口入手 对服务器目录进行扫描&#xff0c;扫出以下目录 访问80端口WEB服务&#xff0c;显示一段文字只允许本地用户访问。 一眼伪造ip&#xff0c;查看页面…

基于土壤数据与机器学习算法的农作物推荐算法代码实现

1.摘要 近年来&#xff0c;机器学习方法在农业领域的应用取得巨大成功&#xff0c;广泛应用于科 学施肥、产量预测和经济效益预估等领域。根据土壤信息进行数据挖掘&#xff0c;并在此基础上提出区域性作物的种植建议&#xff0c;不仅可以促进农作物生长从而带来经济效益&#…

为什么想到微前端,是巨石应用?

为什么想到微前端&#xff0c;是巨石应用&#xff1f; 现代的前端应用的发展趋势正在变得越来越富功能化&#xff0c;富交互化&#xff0c;也就是传说中的SPA(单页面应用)&#xff1b;这样越来越复杂的单体前端应用&#xff0c;背后的后端应用则是数量庞大的微服务集群。被一个…

STM32和emWin必须知道的那些事

emWin 是由德国 SEGGER 公司开发&#xff0c;可为图形 LCD 设计提供高级支持&#xff0c;极大简化了 LCD 设计。 为恩智浦ARM 微控制器用户免费提供的 emWin 图形库。在国内做嵌入式系统的大部分都使用 emwin&#xff0c; 其简单来说就是一套图形库。STemWin是SEGGER公司授权给…