平衡二叉搜索树(AVL)旋转

单独开一章节介绍 RotateL 、 RotateR 及更复杂的 LR 和 RL 型旋转,更多是为了红黑树的旋转部分做铺垫;由于 AVL 树和红黑树发生旋转的判断标准不同 —— 分别为平衡因子和节点的颜色,两棵树左旋和右旋的在细节上会有一些差异,但从整体来看,二者的精神一致。

定义节点

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

关于如何快速记忆什么时候为左旋、右旋、或左右旋、或右左旋,有一个小技巧:

当左树更高,需要向右调整高度,此时右旋;

当右树更高,需要向左调整高度,此时左旋 … …

一、新节点插入较高左子树的左侧 —— 引发右单旋

	void RotateR(Node* parent){Node* ppnode = parent->_parent;Node* subLeft = parent->_left;Node* subLeftR = subLeft->_right;parent->_left = subLeftR;if (subLeftR)subLeftR->_parent = parent;subLeft->_right = parent;parent->_parent = subLeft;if (ppnode == nullptr){_root = subLeft;subLeft->_parent = nullptr;}else {subLeft->_parent = ppnode;}// 调整平衡因子parent->_bf = 0;subLeft->_bf = 0;}
二、新节点插入较高右子树的右侧 —— 引发左单旋

	void RotateL(Node* parent){Node* ppnode = parent->_parent;Node* subRight = parent->_right;Node* subRightL = subRight->_left;parent->_right = subRight;if (subRight)subRight->_parent = parent;subRight->_left = parent;parent->_parent = subRight;if (ppnode == nullptr){_root = subRight;subRight->_parent = nullptr;}else {subRight->_parent = ppnode;}parent->_bf = 0;subRight->_bf = 0;}
三、新节点插入较高左子树的右侧 —— 引发左右双旋

在这里插入图片描述

根据旋转之前 subLeftR 的平衡因子,来决定旋转后各节点的平衡因子。

	void RotateLR(Node* parent){Node* subLeft = parent->_left;Node* subLeftR = subLeft->_right;int bf = subLeftR->_bf; // 记录旋转前的平衡因子RotateL(subLeft);RotateR(parent);if (bf == -1){parent->_bf = 1;subLeft->_bf = subLeftR->_bf = 0;}else if (bf == 1){subLeft->_bf = -1;parent->_bf = subLeftR->_bf = 0;}else {parent->_bf = subLeft->_bf = subLeftR->_bf = 0;}}
四、新节点插入较高右子树的左侧 —— 引发右左双旋

在这里插入图片描述

	void RotateRL(Node* parent){Node* subRight = parent->_right;Node* subRightL = subRight->_left;int bf = subRightL->_bf;RotateR(subRight);RotateL(parent);if (bf == 1){parent->_bf = -1;subRight->_bf = subRightL->_bf = 0;}else if (bf == -1){subRight->_bf = 1;parent->_bf = subRightL->_bf = 0;}else {parent->_bf = subRight->_bf = subRightL->_bf = 0;}}

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

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

相关文章

实现VUE DPlayer录像功能:Canvas加MediaRecorder

在做之前&#xff0c;以为DPlaye知道数据流&#xff0c;录像直接保存即可。结果是&#xff0c;根本没有录像功能。 怎么办呢&#xff1f;搜索了一番&#xff0c;给出的建议是使用Canvas加MediaRecorder来实现。大意是使用canvas&#xff0c;定时把视频画面刷过来&#xff1b;然…

Java基础教程(12)-Java中的IO流

IO是指Input/Output,即输入和输出。以内存为中心: Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等。Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等。流的输入和输出 Java程序通过流来完成输…

发表博客之:cutlass demo讲解,在 sm75 机器上用 cuda core计算 fp32 矩阵乘法!对cutlass 感兴趣的看客别走开!!

文章目录 [发表博客之&#xff1a;cutlass demo讲解&#xff0c;在 sm75 机器上用 cuda core计算 fp32 矩阵乘法&#xff01;对cutlass 感兴趣的看客别走开&#xff01;&#xff01;](https://cyj666.blog.csdn.net/article/details/138469553)深入理解 cutlass 在 sm75 cuda c…

基于Spring Boot的线上交流互动系统设计与实现

基于Spring Boot的线上交流互动系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

「 网络安全常用术语解读 」通用安全通告框架CSAF详解

1. 简介 通用安全通告框架&#xff08;Common Security Advisory Framework&#xff0c;CSAF&#xff09;通过标准化结构化机器可读安全咨询的创建和分发&#xff0c;支持漏洞管理的自动化。CSAF是OASIS公开的官方标准。开发CSAF的技术委员会包括许多公共和私营部门的技术领导…

如何使用预训练的通用音频表示进行心脏杂音检测

心脏杂音检测是心血管疾病诊断中的一个重要方面&#xff0c;通过听诊器进行检查是常见方法&#xff0c;但对临床医生的经验依赖很大。为了减少心脏声音解释中对熟练临床医生的需求&#xff0c;探索自动化心脏听诊的深度学习方法很有必要。然而&#xff0c;尽管深度学习模型通常…

Redis Cluster集群方案什么情况下会导致整个集群不可用?

Redis 没有使用哈希一致性算法&#xff0c;而是使用哈希槽。 Redis 中的哈希槽一共有16384个&#xff0c;计算给定 密钥的哈希槽&#xff0c;我们只需要对密钥的 CRC16 去取 16384。假设集群中有A、B、C三个集群节点&#xff0c; 不存在复制模式下&#xff0c;每个集群的节点包…

、、、、、

、、 、 transient 关键字总结 1&#xff09;transient修饰的变量不能被序列化&#xff1b;2&#xff09;transient只作用于实现 Serializable 接口&#xff1b;3&#xff09;transient只能用来修饰普通成员变量字段&#xff1b;4&#xff09;不管有没有 transient 修饰&…

网络工程师必学知识:SSH登录抓包分析报文交互过程

网络工程师必学知识:SSH登录抓包分析报文交互过程 1.概述:2.SSH传输层协议:3.SSH用户认证协议:4.SSH连接协议:5.抓包看看:6.总结:1.概述: SSH(Secure Shell ,安全外壳协议),就是在不安全的协议外层再加一层安全外壳。比如说telnet+SSH=stelnet。 SSH由三个组件构成:…

ASP.NET网上书店

摘要 本设计尝试用ASP.NET在网络上架构一个电子书城&#xff0c;以使每一位顾客不用出门在家里就能够通过上网来轻松购书。本文从理论和实践两个角度出发&#xff0c;对一个具有数据挖掘功能电子书城进行设计与实现分析。论文首先较为详尽地介绍了面向对象分析与设计的有关概念…

C++实验五 : 类的继承 -----CUST

【题目】 1.定义person类&#xff0c;包括数据私有成员&#xff1a;姓名&#xff0c;性别&#xff1b;共用成员函数&#xff1a;带参数构造函数&#xff0c;display函数输出本类对象的所有数据成员值。 2.定义student类&#xff0c;保护继承person类&#xff1b;增加保护数据成…

docker desktop实战部署oracle篇

1、前言 oracle数据库官方已提供现成的镜像&#xff0c;可以直接拿来部署了。 由于项目中需要使用oracle数据库的分表功能&#xff0c;之前安装的是standard版本&#xff0c;无奈只能重新安装。网上查了一番&#xff0c;使用的方法都比较传统老旧&#xff1a;下载安装包手动安…

golang获取变量动态类型

类型断言&#xff1a;data.(Type) 类型断言是最常用的获取变量动态类型的方法之一。允许在运行时将接口值转换为其具体类型。 data 是一个接口类型的变量。 Type 是一个具体的类型。 这个表达式的含义是&#xff0c;如果 data 的底层值是 Type 类型&#xff0c;那么 value 将接…

深度学习之GAN网络

目录 关于GAN网络 关于生成模型和判别模型 GAN网路的特性和搭建步骤&#xff08;以手写字体识别数据集为例&#xff09; 搭建步骤 特性 GAN的目标函数&#xff08;损失函数&#xff09; 目标函数原理 torch.nn.BCELoss&#xff08;实际应用的损失函数&#xff09; 代码…

百度下拉框负面信息如何删除?

百度头条360等搜索引擎&#xff0c;作为人们获取信息的主要途径之一。然而&#xff0c;一些知名的企业或个人可能会面临在搜索的下拉框中出现负面信息的问题&#xff0c;这可能对其声誉和形象造成不良影响。小马识途营销顾问根据自身从业经验&#xff0c;针对这类情况提出以下建…

轻盈高效开源的WEB在线客服平台:Go-Fly

Go-Fly&#xff1a;即刻沟通&#xff0c;非凡服务&#xff0c;轻松连接每一个对话&#xff0c;让客服日常更简单高效&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Go-Fly 是一款基于 Go 语言 构建的开源即时通讯与客服管理系统&#xff0c;专为寻求高效、可定制在线…

网安学习笔记day-15,交换机工作原理

交换机工作原理 交换机是二层设备&#xff0c;基于MAC表工作。 MAC地址是有48位二进制组成&#xff0c;也就是6字节&#xff0c;通常分为6段&#xff0c;用十六进制表示。 交换机通信方式&#xff1a; 单播&#xff1a;点对点发送数据 广播&#xff1a;向所有设备发送数据…

【c++算法篇】双指针(上)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;算法笔记仓 朋友们大家好啊&#xff0c;本篇文章我们来到算法的双指针部分 目录 1.移动零2.复写零3.快乐数4.盛水最多的容器 1.移动零 题目链接&#xff1a;283.移动零 题目描述&#xff1a; 算法…

【Linux】进程控制 之 进程创建 进程终止 进程等待 进程替换

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

A股上市公司财务松弛数据集(2000-2022年)

01、数据介绍 财务松弛是指企业在运营过程中&#xff0c;由于各种原因导致其财务状况出现一定程度的松弛或宽裕状态。这种状态通常表现为企业持有较多的现金和流动性资产&#xff0c;同时负债相对较少&#xff0c;或者企业有较多的未使用授信额度等。 本数据包括&#xff1a;…