C++ 之AVL树

news2024/11/28 12:27:26

AVL树

  • AVL树的基本概念
    • AVL树的平衡因子、
    • AVL树的旋转
    • avl的双旋
    • 旋转的4种情况

AVL树的基本概念

AVL树的平衡因子、

AVL树的旋转

当平衡因子的高度差过大时,就要选择。所谓的选择其实也是一种压扁的操作
在这里插入图片描述

在本例中 新插入的蓝色结点使得不在平衡。
在这里插入图片描述
我们看上图就能得出 这就是左单旋,左单旋就是把左边压下去,这样左右就一样高了。
左单旋代码演示:
接下来 我们给结点命名
在这里插入图片描述
根据结点名称变化关系:
我们看出 parent 和subr在旋转后,parent和subr都获得了平衡,他们的平衡因子都是0。所以我们在旋转之后 parent,subr都获得了平衡。

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

右旋也是一样。
在这里插入图片描述
和左旋一样,avl的旋转就可以保持水平。

avl的双旋

avl的双旋以下图为例,先左旋后右旋。
在这里插入图片描述
在本例中,左侧二叉树偏高,进行左单旋。 左单旋是将父亲结点的右子树当新的父亲 。
在这里插入图片描述

先左单旋,然互右单旋。左单旋是单旋的父亲的左子树,右单旋是对整个树进行单旋。

在这里插入图片描述
通过这个图,我们可以大概看出来。90 和60的右子树一起去了右边。30去了左边。平衡之后,只有原来的parent 是1 其他都是0.

Node* subL = parent->left;
		Node* subLR = subL->right;
		int bf = subLR->_bf;
		Rotatel(parent->left);
		Rotater(parent);

选择之后,调节后的平衡因子就很重要。
上图为第一种情况, 插入之后,bf为-1.调节之后达到平衡。此时parent为1 其他都为0。
有一种特殊情况。

在这里插入图片描述

双旋之后 每一个结点的平衡因子 都是0.

if (bf == -1)
		{
			parent->_bf == 1;
			subL->_bf = subLR->_bf = 0;
		}
		else if (bf==1)
		{
			subL->_bf = -1;
			parent->_bf = subLR->_bf = 0;
		}
		else if (bf == 0)
		{
			subL->_bf = subLR->_bf = parent->_bf = 0;
		}

具体选择图:
在这里插入图片描述
下面我们给一张图:
在这里插入图片描述

AVL的双旋的另一种 右左双旋。 右左双旋:
在这里插入图片描述
子树右旋之后:
在这里插入图片描述

右旋之后整体情况:
在这里插入图片描述
这个树是典型的RL形

在这里插入图片描述
RL形先右子树右旋 然互左旋
在这里插入图片描述

旋转的4种情况

LL的右旋 cur=-1 parent=-2
在这里插入图片描述
RR的左旋 cur=-1 parent=-1
在这里插入图片描述

LR的双旋 paren=-2 cur=1

在这里插入图片描述
RL的双旋 parent==2 cur=-1
在这里插入图片描述

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

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

相关文章

【CSP试题回顾】201604-1-折点计数

CSP-201604-1-折点计数 解题代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;int n, pointSum;int main() {cin >> n;vector<int>myData(n);for (int i 0; i < n; i){cin >> myData[i];}// 统…

深色系可视化界面看腻了,来点浅色系?安排,20页来了。

只要不放在大屏上展示&#xff0c;贝格前端工场还是非常推崇浅色系的可视化界面&#xff0c;把它作为配色的首选 。浅色系可视化界面具有以下几个优势&#xff1a; 清晰明了 浅色系界面通常使用明亮的颜色&#xff0c;如白色、浅灰色等&#xff0c;使界面元素更加清晰可见。这…

文件MD5校验码的安全性及重要性

title: 文件MD5校验码的安全性及重要性 date: 2024/3/6 18:13:20 updated: 2024/3/6 18:13:20 tags: MD5原理文件校验下载验证数据库一致性安全性保障计算方法MD5安全防护 文件MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希算法&#xff0c;用于验证…

Docker部署(ruoyi案例接上篇Docker之部署前后端分离项目)实施必会!!!!

文章目录 Docker部署前端 Docker部署前端 接上篇博主已经部署好后端Docker部署后端&#xff0c;现在来讲解怎么部署前端 MySQL和redis是不依赖其他任何一个东西的&#xff0c; ruoyi-admin是因为你启动项目的时候是必须连接数据库的 现在去单独启动它 docker start ruoyi-a…

Python爬虫:设置随机 User-Agent

Python爬虫&#xff1a;设置随机 User-Agent 在Python中编写爬虫时&#xff0c;为了模拟真实用户的行为并防止被服务器识别为爬虫&#xff0c;通常需要设置随机的User-Agent。你可以使用fake-useragent库来实现这一功能。首先&#xff0c;你需要安装fake-useragent库&#xff…

【web网页制作】html+css网页制作企业网站办公用品主题(3页面)【附源码】

企业网站目录 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、用品展示Page3、关于我们 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 办公用品企业主题HTML网页制作&#xff0c;…

进程调度算法(先来先服务/短作业优先)代码实现

最近在复习408操作系统进程时&#xff0c;决定用代码模拟调度算法来熟悉详细过程! 选择两个好写点的算法进行练习!!! 以下代码使用c语言。优先队列和队列直接使用STL容器!!! 引入头文件 #include<iostream> #include<queue> #include<map> using namespace …

【漏洞复现】ShopXO任意文件读取漏洞

Nx01 产品简介 ShopXO是一套开源的企业级开源电子商务系统&#xff0c;包含PC、H5、微信小程序、支付宝小程序、百度小程序等多个终端&#xff0c;遵循Apache2开源协议发布&#xff0c;基于ThinkPHP5.1框架研发。该系统具有求实进取、创新专注、自主研发、国内领先企业级B2C电商…

基于stm32的电压采样与质量检测系统

150基于stm32的电压采样与质量检测系统[proteus仿真] 电压检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于stm32的电压采样与质量检测系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xf…

RK356X RK3588 单独编译kernel 与烧录

RK356X RK3588 单独编译kernel 与烧录 可以快速提高我们开发与调试速度 网上可查到的方法如下&#xff1a; RK3568 Android12&#xff1a; 1.添加kernel-4.19/makekernel.sh #!/bin/sh make -j24 ARCHarm64 CC../prebuilts/clang/host/linux-x86/clang-r416183b/bin/clang …

信呼OA普通用户权限getshell方法

0x01 前言 信呼OA是一款开源的OA系统&#xff0c;面向社会免费提供学习研究使用&#xff0c;采用PHP语言编写&#xff0c;搭建简单方便&#xff0c;在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…

裸机编程的几种模式、架构、缺陷

目录 裸机编程模式/架构 1&#xff1a;初始化代码的编写 裸机编程模式/架构 2&#xff1a;轮询模式 裸机编程模式/架构 3&#xff1a;轮询加中断执行模式 裸机编程模式/架构 4&#xff1a;中断定时器主循环的前后台架构 裸机编程模式/架构 5&#xff1a;前后台 状态机架构…

c1-周考2

c1-第二周 9月-技能1.一个岛上有两种神奇动物&#xff0c;其中神奇鸟类2个头3只脚&#xff0c;神奇兽类3个头8只脚。游客在浓雾中看到一群动物&#xff0c;共看到35个头和110只脚&#xff0c;求可能的鸟类和兽类的只数2.构建一个长度为5的数组&#xff0c;并且实现下列要求3.构…

外包干了10天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

Linux系统——SElinux

目录 前言 一、SELinux 的作用及权限管理机制 1.SELinux 的作用 1.1DAC 1.2MAC 1.3DAC 和 MAC 的对比 2.SELinux 基本概念 2.1主体&#xff08;Subject&#xff09; 2.2对象&#xff08;Object&#xff09; 2.3政策和规则&#xff08;Policy & Rule&#xff09;…

【牛客】VL65 状态机与时钟分频

描述 题目描述&#xff1a; 使用状态机实现时钟分频&#xff0c;要求对时钟进行四分频&#xff0c;占空比为0.25 信号示意图&#xff1a; clk为时钟 rst为低电平复位 clk_out 信号输出 Ps 本题题解是按照1000的状态转移进行的&#xff0c;不按照此状态进行&#xff0c;编译器…

小火星露谷管理器 如何一键安装模组

1 选择你喜欢的一键安装模组模板 有两种渠道获取一键安装模板&#xff1a; 通过管理器首页的新手上路按钮&#xff0c;获取sve或里奇赛德村的一键安装模板通过小火星露谷社区获取一键安装模板 1.1 小火星露谷管理器首页获取一键安装模板 管理器的首页有两个内置的一键安装模…

【Docker】提交Docker镜像改变(自定义Redis镜像)

查看某个容器发生改变(操作日志) docker diff redis A: 添加文件或目录(ADD)D:文件或者目录删除(DELETE)C:文件或者目录更改(CHANGE) 对更改的容器进行保存 我们平时使用镜像&#xff0c;会做一些自定义&#xff0c;比如配置文件的修改&#xff0c;数据的增删改等等有很多&…

Linux操作系统性能调优

Linux操作系统性能调优 前言: ​ Linux服务器运行了很多应用&#xff0c;在高负载下&#xff0c;服务器可能会出现性能瓶颈&#xff0c;例如CPU利用率过高、内存不足、磁盘I/O瓶颈等&#xff0c;从而导致系统卡顿&#xff0c;服务无法正常运行等问题。所以针对以上问题&#…

用ChatGPT计算植被归一化指数NDVI并出图的详细教程

用ChatGPT结合GIS计算植被归一化指数NDVI出图教程 用ENVI计算比较繁琐&#xff0c;如今AI的盛行&#xff0c;我们可以轻松解决计算问题&#xff0c;只需1一分钟变可以出图。 详细教学请看上方视频步骤。 更多ChatGPT教学内容请见&#xff1a;ChatGPT结合GIS&#xff1a;一分钟…