C++:AVL树

 

概念:

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。

如图所示,搜索二叉树不能面对右边的树,这种极端的情况,这是就需要AVL树 

什么是AVL树: 

  • 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右 子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均 搜索长度。
  • 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 1、它的左右子树都是AVL树 2、左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)

 

图上的平衡因子是右子树减去左子树的得到的,请注意无论是左子树减去右子树,还是右子树减去左子树,高度差/平衡因子都只能是 -1 、0、1这三个数之一

 AVL树的插入规则:

 如图上图左边子树的插入情况:

  • 2插入了一个新节点,这个节点在2的右边,所以2的平衡因子++ 变成1
  • 然后2的父节点1的平衡因子因为2是1的在右边,所以1的平衡因子也变++ 变成了1
  • 然后1的父节点3的平衡因子因为1是在3的左边,所以3的平衡因子变-- 变成了-2 这时候因为不算平衡因子范围内的树,平衡被打破,需要进行旋转处理

KV结构的AVL树节点代码结构:

  • _parent是父亲节点的意思,需要一个父亲节点才方便更新父亲以及祖先的平衡因子
  • kv是一个具有两个数值的东西,所以kv内部还有东西,kv的frist表示插入的顺序,而kv的second表示插入节点的数值
  • kv模型是按照kv内部的frist进行排序的
  • bf是平衡因子,平衡因子一开始就是0

插入操作:

_parent 父节点的操作:

  • 这段代码中 while找到了插入的位置后,就进行了插入操作,注意while的cur是查询插入位置的,是从根节点出发的
  • 而第二个cur是表示新插入的节点,在之前的while中,我们找到了插入位置的父节点,所以只要比较父节点的k.first是否是大于还是小于需要插入节点的kv.first
  • 随后插入之后,新节点的父节点 _parent 就变成了之前parent,这是为了方便寻找父节点的记录操作,让每一个节点内部都有连向父节点的指针。

更新平衡因子操作:

是根据parent来进行更新的,当parent为空表示平衡因子更新到了根节点

  • 这一段是查看当前节点是父节点的左节点还是右节点,对于插入的节点来说就是查看是否是更新++还是更新--
  • 而对于插入节点的父节点或者祖先节点来说,这种操作就是查看更新平衡因子后的子节点是自己的左节点还是右节点,左边就-- 右边就++
  • 如果父节点的平衡因子是1或者-1就必须还得往上面进行更新,如果是0就不需要更新了 

需要进行旋转的情况:

旋转方式: 
 1、新插入的节点使得左子树变高了

如上图所示,对于左子树更高,我们需要进行右单旋操作:

  • 让30的右边变成60的左边,同时把30的右边变成60以及他的子树,这里要准寻搜索树的规则
  • 如图所示 30比60小,所以在60的左边,同时b比30大但是比60小,所以b放在60的左边没有问题,而旋转后,60比30大,所以60在30的右边是成立的

可以看到 只动了30、 60 、b节点,所以在编写代码的时候以parent为中心进行编写 

又如上图代码所示,如果需要把30、60 b的位置进行交换,而 b 是subLR ,30是subL ,60 是parent ,在交换的过程中需要酱它们节点内部的parent 指向父亲节点的指向进行修改,同时我们需要注意 b 这个节点可能是不存在的,理由如下

所以需要判断b节点是否存在,如果存在那么b节点的内部 中的 父亲节点指针就需要进行 指向的变动,同时还需要注意以下情况:

parent 是根节点,如果parent是根节点,那么subL就需要变成根节点,同时原先的根节点 内部 的 父亲节点指针就需要指向空,同时如果parent不是根节点,就得需要找到parent的父亲节点 让他来改变指向:

如果ppnode的左节点是parent 那么的左边就改变方向指向subL,如果右节点是parent 那就右边指针改变方向指向subL,同时subL的父节点指向ppnode节点,最后因为旋转节点所以平衡因子都需要变成0以此表示平衡了:

完整代码:

2、新插入的节点使得右子树变高了 

如图所示 30 是parent subR是60 subRL是b ,如上图的操作所示,要把 subRL变成parent 的右节点 ,把parent变成subR的左节点,操作和右旋转的操作一样:

左右单旋的情况区分: 

双旋转: 

如上图所示,不论是左单旋还是右旋都无法彻底的解决问题,反而是变成了一种左右单旋来回拉扯的循环问题。

 解决方案:

 先把右子树自己内部进行右单旋,在把整体进行左单选达到最后的效果

完整代码: 

 

 未完待续............................


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[iOS]从拾遗到Runtime(上)

[iOS]从拾遗到Runtime(上) 文章目录 [iOS]从拾遗到Runtime(上)写在前面名词介绍instance 实例对象class 类对象meta-class 元类对象为什么要有元类? runtimeMethod(objc_method)SEL(objc_selector)IMP 类缓存(objc_cache)Category(objc_category) 消息传递消息传递的…

【how2j JQuery部分】课后题答案及相关笔记

练习题 <script src"jquery.min.js"></script><script>$(function(){$(tr:odd).css({"background-color":"#f8f8f8"});}); </script> <style> table{border-collapse:collapse;width:90%;} tr{border-bottom-sty…

安捷伦E4991A美国原装二手KEYSIGHT、E4990A阻抗分析仪

商品品牌&#xff1a;安捷伦Agilent/是德KEYSIGHT 商品型号&#xff1a;E4990A 商品价格&#xff1a;面议或电议 商品详情&#xff1a; Agilent E4990A阻抗分析仪&#xff0c;20 Hz 至 10/20/30/50/120 MHz 主要特性与技术指标 5 种频率选件&#xff1b;20 Hz 至 10/20/30/50/1…

C++学习————第十天(string的基本使用)

1、string 对象类的常见构造 (constructor)函数名称 功能说明&#xff1a; string() &#xff08;重点&#xff09; 构造空的string类对象&#xff0c;即空字符串 string(const char* s) &#xff08;重点&#xff09;…

Java_从入门到JavaEE_11

一、抽象类及抽象方法 1.认识抽象类及抽象方法 应用场景&#xff1a;当一个方法必须在父类中出现&#xff0c;但是这个方法又不好实现&#xff0c;就把该方法变成抽象方法&#xff0c;交给非抽象的子类去实现 实例&#xff1a; //抽象类 public abstract class 类名{//抽象方…

Ansible----playbook模块之templates模块、tags模块、roles模块

目录 引言 一、templates模块 &#xff08;一&#xff09;关键信息 &#xff08;二&#xff09;实际操作 1.定义主机组 2.设置免密登录 3.分别建立访问目录 4.定义模板文件 5.创建playbook文件 6.执行剧本 7.验证结果 二、tags模块 &#xff08;一&#xff09;创建…

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC&#xff08;实时时钟&#xff09;不仅仅提供计数功能&#xff0c;它是一个完整的时钟和日历模块&#xff0c;用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息&#xff0c;并且通常具有闹钟功能&#xff0c;可以用于定时唤醒或触发事件。…

Qt | QLineEdit 类(行编辑器)

01、上节回顾 Qt | QComboBox(组合框)02、QLineEdit 1、QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的 输入部件,即行编辑器,见右图 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…

详细介绍ARM-ORACLE Database 19c数据库下载

目录 1. 前言 2. 获取方式 2.1 ORACLE专栏 2.2 ORACLE下载站点 1. 前言 现有网络上已有非常多关于ORACLE数据库机下载的介绍&#xff0c;但对于ARM平台的介绍不多&#xff0c;借此机会我将该版的下载步骤做如下说明&#xff0c;希望能够一些不明之人提供帮助和参考 2. 获…

【STM32G474】利用Cpp编写STM32代码后,Cubemx修改配置后代码报错147个error,如何处理?

问题描述 打开Cubemx&#xff0c;添加TIM7用于定时器精准延时&#xff0c;生成代码后&#xff0c;Keil提示有147个error。 之前是Cubemx是没有问题的&#xff0c;是利用Cpp编写stm32&#xff08;将Keil改为Version6&#xff09;后才导致Cubemx配置失败&#xff1a; debug成功…

[学习笔记]CyberDog小米机器狗 开发学习

1、机器狗本身是UbuntuROS2系统 2、控制机器人只需要了解lcm和Ros topic通讯 3、传感器数据&#xff08;包括一些imu(/imu)、激光雷达(/scan)&#xff09;会进行topic的一个广播。 仿真环境通信接口&#xff1a; -命令输入(见后续运控说明) 运控lcm数据接口 Motion man…

Gmail邮箱怎么注册?2024年完整指南(包含跳过手机号验证)

一、为什么要注册Gmail邮箱&#xff1f; 全球通用性&#xff1a;Gmail是一个全球性的邮件服务平台&#xff0c;被广泛认可和信赖。因为客户对于Gmail的接受度高&#xff0c;无需担心邮件被自动标记为垃圾邮件。 整合营销工具&#xff1a;通过Gmail账号&#xff0c;你可以轻松…

CleanMyMac X 4.15.3 版本发布

CleanMyMac X 4.15.3 版本发布&#xff0c;一款苹果 macOS 系统好用的伴侣软件&#xff0c;其包含 1.一键深度清理。2.系统垃圾专清。3.大/旧文件专清。4.系统提速。5.性能悬浮窗。6.恶意软件防护。7.隐私保护。8.软件卸载器。9.软件更新器等 9 大功能&#xff0c;为您的苹果电…

Flask-HTTP请求、响应、上下文、进阶实验

本节主要目录如下&#xff1a; 一、请求响应循环 二、HTTP请求 2.1、请求报文 2.2、Request对象 2.3、在Flask中处理请求 2.4、请求钩子 三、HTTP响应 3.1、响应报文 3.2、在Flask中生成响应 3.3、响应格式 3.4、Cookie 3.5、session&#xff1a;安全的Cookie 四、…

[公开课学习]台大李宏毅-自注意力机制 Transformer

自注意力机制 存在一些问题&#xff0c;将vector set/sequence作为input&#xff0c;例如&#xff1a; 文字处理&#xff1a;将文字用one-hot表示&#xff0c;或者向量空间的向量表示&#xff0c;然后进行翻译任务等语音处理&#xff1a;25ms音频作为一个向量&#xff0c;10m…

初识C++ · 模板初阶

目录 1 泛型编程 2 函数模板 3 类模板 1 泛型编程 模板是泛型编程的基础&#xff0c;泛型我们碰到过多次了&#xff0c;比如malloc函数返回的就是泛型指针&#xff0c;需要我们强转。 既然是泛型编程&#xff0c;也就是说我们可以通过一个样例来解决类似的问题&#xff0c…

pytorch基础: torch.unbind()

1. torch.unbind 作用 说明&#xff1a;移除指定维后&#xff0c;返回一个元组&#xff0c;包含了沿着指定维切片后的各个切片。 参数&#xff1a; tensor(Tensor) – 输入张量dim(int) – 删除的维度 2. 案例 案例1 x torch.rand(1,80,3,360,360)y x.unbind(dim2)print(&…

gitlab集群高可用架构拆分部署

目录 前言 负载均衡器准备 外部负载均衡器 内部负载均衡器 (可选)Consul服务 Postgresql拆分 1.准备postgresql集群 手动安装postgresql插件 2./etc/gitlab/gitlab.rb配置 3.生效配置文件 Redis拆分 1./etc/gitlab/gitlab.rb配置 2.生效配置文件 Gitaly拆分 1.…

BACnet转MQTT网关智联楼宇json格式自定义

智能建筑的BACnet协议作为楼宇自动化领域的通用语言&#xff0c;正逐步迈向更广阔的物联网世界。随着云计算和大数据技术的飞速发展&#xff0c;如何将BACnet设备无缝融入云端生态系统&#xff0c;成为众多楼宇管理者关注的焦点。本文将以一个实际案例&#xff0c;揭示BACnet网…

60、郑州大学附属肿瘤医院 :用于预测胃癌患者术后生存的深度学习模型的开发和验证[同学,我们的人生应当是旷野]

馒头老师要说的话&#xff1a; 我近期看了一下北京的脑机公司&#xff0c;大概是我之前对这一行业太过于乐观&#xff0c;北京的BCI公司和研究所&#xff0c;比上海、深圳、杭州甚至是重庆都要少&#xff0c;门槛也要高很多。也有我自己的原因&#xff0c;有时站的太高&#x…
最新文章