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.mzph.cn/web/8509.shtml

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

相关文章

利用Github发现优质的学习项目网址

1. 直接搜索,star的数量越多的项目质量越高 2.Github Trending 地址: https://github.com/trending 3. Gitstar Ranking 地址: https://gistar-ranking.com/ 4. Awesome Topic 地址: https://github.com/topics/awesome

[附源码]秦时明月6.2魔改版_搭建架设教程_附GM工具_安卓苹果

本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了 一. 演示视频 秦时明…

【电路笔记】-Twin-T振荡器

Twin-T振荡器 文章目录 Twin-T振荡器1、概述2、Twin-T振荡器3、Twin-T放大4、Twin-T 振荡器示例5、总结Twin-T 振荡器是另一种 RC 振荡器电路,它使用两个并联的 RC 网络来产生单一频率的正弦输出波形。 1、概述 Twin-T 振荡器是另一种类型的 RC 振荡器,它产生正弦波输出,用…

牛客 二叉树 NB1 牛群的最大高度

原题链接 就不采用, 递归的方式来做了, 自己弄个栈来做 用栈来保存路径, curr 表示当前的节点, pre 保留往回走时的上一步 如果是 用递归来做 它的栈链路是这样的, 可以做下参考 黄色表示返回 用栈模拟的话, 不可能模拟得一摸一样, 递归的话一个栈会经过3次, 第三次后就不…

医学论文摘要翻译 中译英哪里比较专业

论文摘要是对论文内容不加注释和评论的简短陈述,需要扼要说明论文的目的、研究方法和最终结论。在发表学术论文时,很多重要刊物会要求作者将文章的摘要翻译成英文。那么,针对医学论文摘要翻译,中译英哪里比较专业? 专…

【C++】详解STL容器之一的 vector

目录 概述 迭代器 数据结构 优点和缺点 接口介绍 begin end rbegin rend resize reseve insert erase 其他一些接口 模拟实现 框架 获取迭代器 深浅拷贝 赋值重载 reseve resize 拷贝构造 构造 析构 insert erase 其他 概述 vector是STL的容器之一。…

连接docker中的MySQL出现2058错误

出错场景:在虚拟机中用docker技术下载最新版本的MySQL,在本地电脑上连接发现出现2058错误。 解决方法: 按照以下步骤 1. 2. ALTER USER root% IDENTIFIED WITH mysql_native_password BY 自己MySQL的密码; 3.成功

redis--安装

简介 官网:RedisInsight - The Best Redis GUI 各个版本官网下载地址:http://download.redis.io/releases/ Redis和Memcached是非关系型数据库也称为NoSQL数据库,MySQL、Mariadb、SQL Server、PostgreSQL Oracle 数据库属于关系型数据 应用…

为什么选择ATECLOUD自动化测试平台?

在当今飞速发展的时代,一切都在不断进步与变革,电测行业也由手动测试逐步转向了自动化测试。但是随着科技的发展,对于产品的测试要求也越来越高,传统的自动化测试系统已经无法满足用户日益增长的测试需求,全新的ATE测试…

优化理论复习——(四)

无约束优化专题,主要使用了序列无约束极小化方法 无约束优化问题相关解法 最优性条件 互补松弛条件 对于一般约束优化问题: 整理一下就是著名的kkt条件: 这里只需要注意一点,那就是互补松弛条件只对不等式约束有限制。 然后是…

在全志H616核桃派开发板上实现超声波传感器测距

前言​ 超声波传感器是一款测量距离的传感器。其原理是利用声波在遇到障碍物反射接收结合声波在空气中传播的速度计算的得出。在测量、避障小车,无人驾驶等领域都有相关应用。 实验目的​ 通过python编程实现超声波传感器测距。 实验讲解​ 下图是一款市面上常…

【智能算法】雪消融优化算法(SAO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2023年,L Deng受到雪升华和融化行为启发,提出了雪消融优化算法(Snow Ablation Optimizer, SAO)。 2.算法原理 2.1算法思想 SAO模拟了雪的…

C语言,实现数字谱到简谱的转换(二)

C语言,实现数字谱到简谱的转换(二) 前言:本文初编辑于2024年5月8日 CSDN:https://blog.csdn.net/rvdgdsva 博客园:https://www.cnblogs.com/hassle 前言 结合前文使用 之前的程序默认C调4/4拍&#xff…

探索DeepSeek平台:新一代MoE模型的深度体验

简介 DeepSeek是一个创新的人工智能平台,它最近推出了其最新版本的模型——DeepSeek-V2 MoE(Mixture of Experts)。这个平台不仅提供了一个交互式的聊天界面,还提供了API接口,让用户可以更深入地体验和利用这一先进的…

使用SpringBoot+Redis做一个排行榜【推荐】

SpringBoot Redis实现排行榜 一、Zset有序集合介绍 Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了…

Service 和 Ingress

文章目录 Service 和 IngressServiceEndpointservice 的定义代理集群外部服务反向代理外部域名Service 常用类型 IngressIngress-nginx安装使用 Service 和 Ingress service 和 ingress 是kubernetes 中用来转发网络请求的两个服务,两个服务用处不同,se…

去哪儿前端一面

谈谈你对mvvm的理解 MVVM分为三个部分:分别是M(Model,模型层 ),V(View,视图层),VM(ViewModel,V与M连接的桥梁,也可以看作为控制器) 1、 M:模型层,主要负责业务数据相关; 2、 V:视图层,顾名思义,负视图相关,细分下来就是html+css层; 3、 VM:V与M沟通的…

数据结构学习——二叉树

1. 树概念及结构 1.1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&…

用户下单操作

一:用户下单需求分析和设计: 用户下单业务说明: 在电商系统中,用户是通过下单的方式通知商家,用户已经购买了商品,需要商家进行备货和发货。 用户下单后会产生订单相关数据,订单数据需要能够体…

如何使用多协议视频汇聚/视频安防系统EasyCVR搭建智慧园区视频管理平台?

智慧园区作为现代化城市发展的重要组成部分,不仅承载着产业升级的使命,更是智慧城市建设的重要体现。随着产业园区竞争的逐渐白热化,将项目打造成完善的智慧园区是越来越多用户关注的内容。 然而我们往往在规划前期就开始面临众多难题&#…