learn C++ NO.21——AVL树

简单介绍一下AVL树

AVL树是一种自平衡的二叉搜索树(Balanced Binary Search Tree, BBST),由俄罗斯数学家G. M. Adelson-Velsky和E. M. Landis在1962年发明,因此以其名字首字母命名。AVL树通过保持任何节点的两个子树的高度最大差别为1来确保树的平衡,这种平衡性使得AVL树在插入、删除和查找操作中具有较好的性能。这里我讲解的是以引入平衡因子的AVL树的模拟实现。平衡因子 = 左子树高度 - 右子树高度。

AVL树为什么不能做到绝对平衡呢?因为实际使用中,数据可能是一次一次插入的。这样导致了没有办法维持绝对平衡的结构。

AVL的增删改查的时间复杂度是O(lgN),它相较于二叉搜索树来说,通过平衡树的高度来提高了时间复杂度的上限。

插入接口的模拟实现

在实现insert之前,简单把AVL树的基本模子整起来
在这里插入图片描述

下面正式介绍insert接口。这里我先将二叉搜索树的插入接口的逻辑部分先写出来。
在这里插入图片描述
接下来重点介绍一下引入平衡因子以维持AVL树的平衡特性。因为平衡因子 = 右子树高度 - 左子树高度。

所以,当新节点插入在左边时,新节点的父亲节点的平衡因子–。当新节点插入在右边时,新节点的父亲节点的平衡因子++。

如果更新完父亲节点的平衡因子后,恰好父亲的平衡因子等于0,此时,说明parent所在的子树的高度不变, 不会再影响祖先, 不用再继续沿着到root的路经往上更新。插入结束,直接返回true。

在这里插入图片描述
如果此时更新完平衡因子后,父亲节点的平衡因子为1或-1时,仍然需要向上更新祖先节点的平衡因子。因为可能祖先的平衡因子的绝对值已经为2了。此时,继续向上更新平衡因子。
在这里插入图片描述

更新后parent平衡因子 ==2 or -2, 说明parent所在的子树的高度变化且不平衡, 对parent所在子树进行旋转, 让他平衡。然后插入结束

在这里插入图片描述

还有一个比较特殊的边界情况,当更新平衡因子更新到根节点时,插入结束。

在这里插入图片描述
接下来介绍旋转部分的内容。
首先介绍一下左单旋转。
在这里插入图片描述

通过上图可以看到,左单旋转的主要实现逻辑就是,将cur的左子树连接到parent的右子树,然后,将parent连接到cur的左子树。然后修改cur、parent、curLeft的_parent。最后将平衡因子修改成0。

具体的细节有需要考虑curLeft是否为空,以及parent->_parent是否为空的问题。以及需要让cur连接parent->_parent。

左单旋参考代码如下
在这里插入图片描述

再来看右单旋的实现
在这里插入图片描述

通过上图可以看到,右单旋转的主要实现逻辑就是,将cur的右子树连接到parent的左子树,然后,将parent连接到cur的右子树。然后修改cur、parent、curLeft的_parent。最后将平衡因子修改成0。细节问题同左旋转一致,这里不做赘述。

右单旋参考代码如下
在这里插入图片描述

下面介绍一下右左单旋
在这里插入图片描述
我们需要先对90进行右单旋,让后对30进行左单旋。然后树的高度就平衡了
在这里插入图片描述

虽然左旋接口和右旋接口可以复用。但是左旋和右旋接口中,统一将平衡因子全部改为0,这不符合双旋后的平衡因子。修改平衡因子需要考虑三个情况。

情况一,新增节点的平衡因子为 0。那么此时将parent、cur和curLeft的平衡因子全部修改成0即可。
blog.csdnimg.cn/direct/5a8daa91eab3400f947a68aff2bac82c.png)
情况二,新节点插入在curleft的右子树诱发的双旋。双旋后,需要将parent的平衡因子修改成-1,cur和curleft的平衡因子为0。
在这里插入图片描述
情况三,新节点插入在curleft的左子树诱发的双旋。双旋后,需要将cur的平衡因子修改成1,parent和curleft的平衡因子为0。

在这里插入图片描述
右左双旋参考代码
在这里插入图片描述
左右双旋的情况如下
在这里插入图片描述
这里的更新平衡因子一样需要考虑三个情况,分别为当curright为新插入节点时,三个节点平衡因子都为0。以及当插入在b位置时 parent的平衡因子为 1, cur和curright平衡因子为0。 以及当插入在c位置时, parent和curright的平衡因子为0, cur的平衡因子为-1。

参考代码如下
在这里插入图片描述

完整insert接口参考代码如下
在这里插入图片描述

总结一下insert接口,就是在二叉搜索树的insert的基础上引入平衡因子以及旋转的概念。引入平衡因子为了让树的高度差绝对值小于2,这样让搜索树的结构的到保证。让增删改查效率为树的高度次,即O(lgN)。而旋转就是保证平衡因子能够保证高度差绝对值小于2的手段。旋转一共分为单旋和双旋。单旋分左单旋和右单旋,双旋分左右双旋和右左双旋。通过学习AVL树insert接口,可以感受到AVL树的高效性能以及性能高效背后的原因。

删除接口的介绍

删除接口的实现思路如下,首先,按照搜索树的规则进行节点的删除。然后,再删除节点位置向上更新平衡因子。最后,若平衡因子为2或者-2,进行相应旋转来平衡高度。

学习了插入接口,相应的删除接口也就很好理解它的原理。处于学习者的角度看,AVL树的结构理解了就行,并不是需要我们去造一个轮子。毕竟知识是无穷无尽的,咱的精力是 有限的。

总结

AVL树是一种复杂且性能强悍的数据结构。它通过平衡因子绝对值小于2来控制二叉搜索树的高度,以达到增删改查的高效。通过insert的模拟实现,明白了如何使用旋转操作保证AVL树的平衡因子绝对值小于2。当然,并不是所有的AVL树都是这么设计,不使用平衡因子也能够做到控制好树的绝对高度。但是,这么设计代码的可读性就没那么好了。

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

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

相关文章

笔记 | ASPICE 简介

什么是 ASPICE(Automotive SPICE) Automotive SPICE(简称 A-SPICE 或 ASPICE)是欧洲 20 多家主要汽车制造商以ISO/IEC 15504(SPICE,Software Process Improvement and Capability dEtermination&#xff0…

Java反射专题

目录 一.反射机制 1.Java Reflection 2.反射相关的主要类 3.反射的优缺点 4.反射调用优化—关闭访问检查 二.Class类 1.基本介绍 2.常用方法 3.获取Class对象的方式 4.那些类型有Class对象 三.类加载 1.介绍 2.类加载时机 3.类加载各阶段 四.获取类结构的信息 1…

基于微信小程序的网上商城+ssm论文源码调试讲解

2 系统开发环境 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行,目前微信开发者工具任然在不断的完善中,在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具,开发者工具将使用这个微信帐号的信息进行小程…

教育领域中聊天机器人和会话代理的使用分析和趋势:一项文献计量学回顾

英文标题: Analysis and Trends in the Use of Chatbots and Conversational Agents in Education: a Bibliometric Review 作者信息: Dennis Arias-Chvez, Universidad Continental, Arequipa, Per; dariascontinental.edu.pe; ORCID: ORCIDTeresa Ramos-Quispe, Universida…

网络连接失败的解决方案

文章目录 问题描述解决方案 问题描述 在公司连不上网,域名解析没问题,经检测是IP地址有问题 解决方案

.NET 一款提权工具:Sharp4PetitPotato

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

使用 YOLOv 11 模型实现实时手语检测 可同时识别多个手语手势

项目:Yolo11 - Roboflow - OpenCV 手语是聋哑人之间以及他们与外界沟通的重要工具,然而,许多不会手语的人无法与他们有效交流。这个项目的目标是通过自动检测手语手势,构建一个可以帮助聋哑人和普通人之间沟通的桥梁,…

PCL 法向量精细化处理

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 pcl::NormalEstimationOMP 2.1.2 pcl::NormalRefinement 2.1.3 visualizePointCloud 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云…

非酒精性脂肪性肝炎NASH临床赛道的百米冲刺,谁将成为胜者?

前 言 非酒精性脂肪性肝炎(NASH)是一种与肥胖、血脂异常、2型糖尿病和代谢综合征密切相关的疾病,可能会发展为肝硬化、终末期肝病甚至肝癌。据美国肝脏基金会统计数据显示,截至2023年8月,美国成年人中有5%的NASH患者…

【牛客刷题实战】BC120 争夺前五名

大家好,我是小卡皮巴拉 文章目录 目录 牛客题目: BC120 争夺前五名 题目描述 输入描述: 输出描述: 示例1 示例2 解题思路: 具体思路: 题目要点: 完整代码: 兄弟们共…

WMS 智慧仓储管理系统的可视化管理_SunWMS

【大家好,我是唐Sun,唐Sun的唐,唐Sun的Sun。一站式数智工厂解决方案服务商】 WMS 智慧仓储管理系统的可视化管理主要表现在以下几个方面: 首先是库存可视化。通过系统,仓库管理人员能够以直观的图表、图形等形式清晰地…

基于sklearn的机器学习应用平台 v2.0

基于sklearn的机器学习应用平台 v2.0 链接:https://pan.baidu.com/s/1nvHMTrtBmtPLT4oNXdw74A 提取码私信博主获取 关于作者 作者:小白熊 作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机…

【实时计算 Flink】检查点和快照超时的诊断方法与调优策略

Flink的状态管理是一个复杂而关键的领域,涉及到作业的性能、稳定性和资源利用等多个方面。通过对状态生成机制和优化策略地深入理解与正确应用,结合实时计算Flink版提供的产品能力,可以帮您有效地优化Flink作业以应对大规模状态作业带来的挑战…

卫瓴科技,驶向「协同CRM」深水区

在卫瓴协同CRM的产品之上,能看到的不单纯是产品本身,即“提高转化率”这个单纯的指标,而更多的是在产品之中蕴含的“现代企业营销建设”的科学理念和认知。以此为基础,企业可以构建真正有价值且能长期驱动的品牌营销模型。 作者…

是德(Keysight)N9030A、N9030B PXA信号分析仪

Keysight N9030B PXA 信号分析仪是加速高要求应用创新的性能基准。 PXA 提供从优秀到卓越的测量选项,让您处于领先地位。利用高达 510 MHz 的分析带宽和优于 70 dB 的 SFDR 来分析最新信号,并通过本底噪声扩展 (NFE) 揭示以前隐藏的信号。要了解设备的真…

pdf怎么加密码怎么设置密码?这几种pdf设置密码的方法简单!

pdf怎么加密码怎么设置密码?PDF格式作为现代办公和学习中频繁使用的文档类型,其身影遍布于各类场景,然而,在享受PDF带来的便利之余,不少用户对其安全性产生了疑虑,尽管PDF文件相较于其他格式更难被直接编辑…

养生健康:从日常细节中寻觅长寿之钥

养生健康:从日常细节中寻觅长寿之钥 在这个快节奏的时代,健康似乎成了一种奢侈品,但实则不然。养生之道,不在于繁复的仪式,而在于融入日常的点点滴滴。今天,就让我们一起探讨几个简单却至关重要的养生习惯…

冷流还是热流

https://www.youtube.com/watch?vM8YtV47kaqA&t607s pl学习视频 什么是冷流&#xff1f; fun fibonacci(): Flow<BigInteger> flow {var x BigInteger.ZEROvar y BigInteger.ONEwhile (true) {println("fibonacci while $x")emit(x)x y.also {y x}…

【GESP】C++一级练习BCQM3033,略微复杂的计算,国庆七天乐

应该算第一道对小学生来说&#xff0c;计算逻辑稍微复杂一点的题目。多定义几个变量可能对解题过程更有帮助。 题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3033/ 【GESP】C一级练习BCQM3033&#xff0c;略微复杂的计算&#xff0c;国庆七天乐 | OneCoder应该算第…

前端vue-安装pinia,它和vuex的区别

创建一个store的目录&#xff0c;任意一个js文件&#xff0c;再导入pinia&#xff0c;再定义