hello树先生——AVL树

AVL树

  • 一.什么是AVL树
  • 二.AVL树的结构
    • 1.AVL树的节点结构
    • 2.插入函数
    • 3.旋转调整
  • 三.平衡测试

一.什么是AVL树

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。
AVL树的性质:

  • 它的左右子树都是AVL树
  • 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)
  • 如果一棵二叉搜索树是高度平衡的,它就是AVL树。如果它有n个结点,其高度可保持在 O ( l o g 2 n ) O(log_2 n) O(log2n)
    在这里插入图片描述

二.AVL树的结构

1.AVL树的节点结构

template<class K, class V>
struct AVLTreeNode
{AVLTreeNode* _left;AVLTreeNode* _right;AVLTreeNode* _parent;pair<K, V> _kv;int _bf;AVLTreeNode(const pair<K,V>& kv):_left(nullptr),_right(nullptr),_parent(nullptr),_kv(kv),_bf(0){}
};

这里的数据存储使用pair类型的数据对,将key索引与对应数据value存储,增加了_parent保存父亲节点,增加了_bf平衡因子来衡量左右子树是否平衡。

2.插入函数

bool insert(const pair<K, V>& kv)

这里插入方式与搜索二叉树一致,只是在后面增加了平衡调整的步骤

//如果根为空if (_root == nullptr){_root = new node(kv);return true;}//找到目标值node* parent = nullptr;node* cur = _root;while (cur){//key < curif (kv.first < cur->_kv.first){parent = cur;cur = cur->_left;}else if (kv.first > cur->_kv.first){parent = cur;cur = cur->_right;}else{//查重return false;}}//插入目标值cur = new node(kv);if (parent->_kv.first < kv.first){parent->_right = cur;}else{parent->_left = cur;}cur->_parent = parent;

调节平衡因子

while(parent)
{
//向上更新
}

如果插在左子树,则平衡因子–,否则++

if (parent->_left == cur){parent->_bf--;}else{parent->_bf++;}

判断平衡因子是否正常倘若>=2则需要旋转

			if (parent->_bf == 0){break;}else if(parent->_bf == -1 || parent->_bf == 1){//向上调整cur = parent;parent = parent->_parent;}else if (parent->_bf == -2 || parent->_bf == 2){//需要旋转//左左高,右单旋if (parent->_bf == -2 && cur->_bf == -1){rotater(parent);}//右右高,左单旋else if(parent->_bf == 2 && cur->_bf == 1){rotatel(parent);}//右左高,先右旋成为右右高,再左旋else if (parent->_bf == 2 && cur->_bf == -1){rotaterl(parent);}else{rotatelr(parent);}break;}else{//大问题assert(false);}

3.旋转调整

AVL树的旋转分为四种,左单旋,右单旋,左右双旋和右左双旋。

1.右单旋

	void rotater(node* parent)

在这里插入图片描述
当插入new节点时,60节点会左右失衡,我们称60为parent,30为subl,则平衡因子会分别变为-2,-1,成为左左高模型,此时使用右单旋。
由于搜索树特性:30<b<60<c,所以可以将右方降下去,从而达到平衡。

  • 传入旋转点parent

  • 记录关键节点,防止旋转后丢失
    在这里插入图片描述

		node* subl = parent->_left;node* sublr = subl->_right;
  • 将parent的左指向sublr,若sublr为空节点,则不链接父亲节点否则链接
  • 将subl的右指向parent,同时链接父亲节点
		parent->_left = sublr;if (sublr)sublr->_parent = parent;subl->_right = parent;parent->_parent = subl;//保存父节点node* ppnode = parent->_parent;subl->_parent = ppnode;
  • 考虑parent是否为根,是否链接parent的父亲节点
		//考虑parent是否为根if (ppnode == nullptr){_root = subl;subl->_parent = nullptr;}else{subl->_parent = ppnode;if (ppnode->_left == parent){ppnode->_left = subl;}else{ppnode->_right = subl;}}
  • 修改平衡因子
parent->_bf = subl->_bf = 0;

2.左单旋
大体思路与右单旋相同
在这里插入图片描述

	void rotatel(node* parent){node* subr = parent->_right;node* subrl = subr->_left;parent->_right = subrl;if (subrl)subrl->_parent = parent;subr->_left = parent;//保存父节点node* ppnode = parent->_parent;parent->_parent = subr;subr->_parent = ppnode;//考虑parent是否为根if (ppnode == nullptr){_root = subr;subr->_parent = nullptr;}else{subr->_parent = ppnode;if (ppnode->_left == parent){ppnode->_left = subr;}else{ppnode->_right = subr;}}//调节平衡因子parent->_bf = subr->_bf = 0;}

3.左右双旋

void rotatelr(node* parent)

通常双旋有三种情况,在b里插入新节点,在c里插入新节点,或者b,c都为空
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

记录sul的平衡因子,方便判断是哪种情况

		node* subl = parent->_left;node* sublr = subl->_right;int bf = subl->_bf;rotatel(subl);rotater(parent);
		if (bf == -1){subl->_bf = 0;parent = 1;}else if (bf == 1){subl->_bf = -1;parent->_bf = 0;}else if (bf == 0){subl->_bf = 0;parent->_bf = 0;}sublr->_bf = 0;

每一种情况平衡因子不同,所以需要画图分别讨论
** 4.右左双旋**

void rotaterl(node* parent){node* subr = parent->_right;node* subrl = subr->_left;int bf = subr->_bf;rotater(subr);rotater(parent);if (bf == -1){subr->_bf = 1;parent = 0;}else if (bf == 1){subr->_bf = 0;parent->_bf = -1;}else if (bf == 0){subr->_bf = 0;parent->_bf = 0;}subrl->_bf = 0;}

三.平衡测试

判断是否平衡

    bool _IsBalance(node* root){if (root == nullptr){return true;}int leftheight = _height(root->_left);int rightheight = _height(root->_right);if (abs(leftheight - rightheight) >= 2){return false;}//判断节点平衡因子是否正确if (root->_bf != (rightheight - leftheight)){return false;}return _IsBalance(root->_left) && _IsBalance(root->_right);}

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

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

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

相关文章

python学习——爬虫之session请求处理cookie

import requestssessionrequests.session() url"https://passport.17k.com/ck/user/login" data{"loginName": "19139186287","password":"2001022600hzk"} ressession.post(url,datadata) print(res.text)# session通过会话…

Windows系统中批量管理Windows服务器远程桌面工具——RDCMan

一、背景 在公司没有部署对应的堡垒机系统之前,做运维测试工作的人员,需要管理大量的服务器,每天需要对服务器进行必要的巡检、系统更新发布等内容,特别是有很多Windows服务器的时候,如果我们使用Windows自带的“远程桌面连接”只能一台台连接,比较繁琐。并且不能知道那台…

【手撕数据结构】二叉树的性质

目录 叶子节点和边的性质概念小试牛刀 叶子节点和边的性质 概念 可以看到度为0的节点如F没有边&#xff0c;度为1的节点如C有一条边&#xff0c;而度为2的节点如B有两条边。那么设度为2的节点为a个&#xff0c;度为1的节点为b个。二叉树边 2ab另⼀⽅⾯&#xff0c;由于共有 a…

AcWing 897. 最长公共子序列

动态规划就是多见识应用题就完事儿了&#xff0c;也没有什么好说的。 讲解参考&#xff1a; 【E05 线性DP 最长公共子序列】 #include<iostream> #include<algorithm> #define N 1010 using namespace std; char a[N],b[N]; int n,m; int f[N][N]; int main(){…

Loki Unable to fetch labels from Loki (no org id)

应该是多租户相关导致的 参考文档: 参考文档cMulti-tenancy | Grafana Loki documentationDescribes how Loki implements multi-tenancy to isolate tenant data and queries.https://grafana.com/docs/loki/latest/operations/multi-tenancy/ https://github.com/grafana…

主流AI绘画工具-StableDiffusion本地部署方法(mac电脑版本)

Stable Diffusion是一款强大的AI生成图像模型&#xff0c;它可以基于文本描述生成高质量的图像。对于想要在本地运行此模型的用户来说&#xff0c;使用Mac电脑部署Stable Diffusion是一个非常吸引人的选择&#xff0c;特别是对于M1或M2芯片的用户。本文将详细介绍如何在Mac上本…

高效能低延迟:EasyCVR平台WebRTC支持H.265在远程监控中的优势

TSINGSEE青犀视频EasyCVR视频汇聚平台在WebRTC方面确实支持H.265编码&#xff0c;尽管标准的WebRTC API在大多数浏览器中默认并不支持H.265&#xff08;也称为HEVC&#xff0c;高效视频编码&#xff09;编码。EasyCVR平台通过一系列创新的技术手段&#xff0c;实现了在WebRTC协…

食家巷中秋美食,味蕾上的团圆盛宴

月到中秋分外明&#xff0c;在这个充满温情与思念的节日里&#xff0c;美食成为了人们传递情感、共享团圆的重要载体。而食家巷&#xff0c;以其独特的中秋美食&#xff0c;为这个佳节增添了一抹别样的风味。 走进食家巷&#xff0c;仿佛踏入了一个美食的宝藏之地。这里的传统…

excel规划求解结合vba宏笔记

目录 概念与配置 规划求解定义 excel设置规划求解 宏的基本操作 excel批量进行规划求解案例 加载规划求解模块 宏的设置 宏录制vba 其他案例 概念与配置 规划求解定义 运用“规划求解”定义并求解问题 - Microsoft 支持 excel设置规划求解 EXCEL规划求解的简明教程…

突破代码:克服编程学习中的挫折感

目录 一、心态调整&#xff1a;心理韧性的培养 接受挫折是学习的一部分 设置实际的学习目标 保持学习的乐趣 二、学习方法&#xff1a;策略的实施 逐步解决问题 寻找多样的学习资源 定期复习与实践 三、成功经验&#xff1a;实例的启示 Debug的技巧掌握 算法的深入理…

开发中如何在运行/调试时将项目热部署到Tomcat

这里有一篇不错的博客&#xff0c;可以参考 http://t.csdnimg.cn/oWcgm 正常情况下&#xff0c;我们将web项目打包成war包后&#xff0c;需要放到tomcat的webapps路径下&#xff0c;然后启动tomcat&#xff0c;才能正常访问。但是这在开发阶段是极为不便的。因此可以使用两种方…

Qt_两种创建组件的方式-通过图形化-通过代码

文章目录 一、通过图形化的方式&#xff0c;在界面上创建一个控件&#xff0c;显示hello world1.打开UI设计界⾯2.拖拽控件⾄ ui 界⾯窗⼝并修改内容3.构建并运行 二、通过代码的方式&#xff0c;通过编写代码&#xff0c;在界面上创建控件&#xff0c;显示hello world在Widget…

AIGC提示词(2):塑造未来内容创作的核心力量

引言 &#x1f31f; 在这个数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正变得越来越普遍。从自动写作到图像生成&#xff0c;AI正以前所未有的速度和多样性创造内容。然而&#xff0c;要实现高质量和相关性强的内容生成&#xff0c;关键在于有效地…

已成功入职小米大模型岗!!大模型面试其实挺水的,hr听到这些直接过

小米大模型面试180题 1、目前比较受欢迎的开源大模型有哪些&#xff1f; GPT系列&#xff1a;由OpenAl开发的生成式预训练模型&#xff0c;如 GPT-3。 BERT系列&#xff1a;由Google开发的转换式预训练模型&#xff0c;如BERT、RoBERTa等。 T5系列&#xff1a;由Google开发的基…

003、架构_详解(重点)

GoldenDB 分布式数据库框架 DN和RDB增加了备节点;引入新模块CM,且GTM、MDS、PM、CM都增加备节点;MDS、PM、CM、RDB被统一在了管理节点之中;GTM和MDS间多了一条连线,因为GTM的切换由MDS把控;初步系统架构mysqld:一般称为DB节点,负责单个节点的数据处理; dbproxy:一般…

Gitee上传项目(从0开始)

1.默认你Git已经下载好的情况下。 下载好的两种显示&#xff1a; 1.右击桌面显示这个 2.如果没有情况1出现&#xff0c;需要自己去创建快捷方式 2.去网站创建仓库 网站参考&#xff1a;yanyongzhitest/java_web - 码云 - 开源中国 (gitee.com) 新建仓库&#xff1a; 仓库名…

版本管理工具 Git 的下载安装及使用

1 基本介绍 Git 是目前最流行的分布式版本控制软件 什么是分布式版本控制软件&#xff1f; 所有版本信息仓库全部同步到本地的每个用户可以在本地查看所有版本历史&#xff0c;可以离线在本地提交&#xff0c;只需在连网时 push 到相应的服务器或其他用户那里。每个用户那里…

为什么echarts极坐标柱形图的图形显示的特别小呢??如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

最新Vmware17的WIn10虚拟机开箱即用,免安装

这篇文章分享的Vmware安装Win10的教程&#xff0c;如过有些懒得装Win10的同学可以会直接使用我的WIn10镜像压缩包打开即可 Win10镜像压缩包下载 tips&#xff1a;⬆️⬆️包含Vmware17安装包 使用方法&#xff0c;打开Vmware

皕盛电商平台:为合作伙伴提供广阔的发展空间

随着互联网的快速发展&#xff0c;我国电商行业已经取得了显著的成果&#xff0c;越来越多的企业和个人投身于电商领域。在众多电商平台中&#xff0c;皕盛电商平台以其独特的方式&#xff0c;为消费者、商家和合作伙伴创造了一个全新的电商生态圈。 一、关于皕盛电商平台 皕…