手撕红黑树的 左旋 与 右旋

一、为什么需要旋转?

在红黑树中,插入或删除节点可能会破坏其五条性质,比如高度不平衡或连续红节点。

为了恢复红黑性质,我们采用局部旋转来“调整树形结构”,保持平衡。


二、旋转本质是“局部变形”

  • 左旋和右旋不会破坏中序遍历结果(即元素仍是有序的)
  • 旋转只是在三到四个节点之间调整指针结构

三、🔄 左旋(Left Rotation)

目的:把某个节点往上提,把右子节点放下来

对节点 x 做左旋,即把 x 的右子节点 y 转换为其父节点,y 的左子树转为 x 的右子树。

✅ 前提:
  • 节点 x 有一个右子节点 y
📌 结构变化图:
原始结构:             旋转后结构:x                      y
\                    /
y       -->        x
/                      \
T1                      T1
🔧 伪代码(C++ 风格):
Node* leftRotate(Node* x) {Node* y = x->right;x->right = y->left;if (y->left) y->left->parent = x;y->parent = x->parent;if (!x->parent) root = y;else if (x == x->parent->left) x->parent->left = y;else x->parent->right = y;y->left = x;x->parent = y;return y;
}

四、🔁 右旋(Right Rotation)

目的:把某个节点往上提,把左子节点放下来

对节点 y 做右旋,即把 y 的左子节点 x 转换为其父节点,x 的右子树转为 y 的左子树。

✅ 前提:
  • 节点 y 有一个左子节点 x
📌 结构变化图:
原始结构:             旋转后结构:y                    x
/                      \
x         -->           y
\                    /
T1                T1
🔧 伪代码(C++ 风格):
Node* rightRotate(Node* y) {Node* x = y->left;y->left = x->right;if (x->right) x->right->parent = y;x->parent = y->parent;if (!y->parent) root = x;else if (y == y->parent->left) y->parent->left = x;else y->parent->right = x;x->right = y;y->parent = x;return x;
}

五、动手建议

手动画出下面结构并旋转:

         10\20\30

此时你对 10 进行左旋,会得到:

         20/  \10    30

六、应用场景提示

  • 左旋和右旋是红黑树维护性质的唯一“结构性操作”
  • 接下来我们讲:插入时的三种情况 + 旋转修复方式

✅ 小测试

  1. 红黑树为什么旋转后仍能保持 BST 的性质?
  2. 左旋后,原节点的右子节点发生了什么变化?
  3. 红黑树旋转是否会破坏红黑性质?

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

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

相关文章

不用官方EDA怎么开发FPGA?

目前FPGA的开发和官方的EDA工具是高度绑定的,用哪家的芯片只能用其配套的EDA工具进行开发(综合可选工具,布局布线没有可选的工具),那么有没有其他的开发方式呢?今天就介绍一个使用开源工具链来开发FPGA的方…

QuecPython+Aws:快速连接亚马逊 IoT 平台

提供一个可接入亚马逊 Iot 平台的客户端,用于管理亚马逊 MQTT 连接和影子设备。 初始化客户端 Aws class Aws(client_id,server,port,keep_alive,ssl,ssl_params)参数: client_id (str) - 客户端唯一标识。server (str) - 亚马逊 Iot 平台服务器地址…

44.辐射发射整改简易摸底测试方法

辐射发射整改简易摸底测试方法 1. 正式摸底预测试2. 简易方法预测试3. 分析频谱4. 探查传播路径5. 施加措施6. 与简易方法预测试效果对比 1. 正式摸底预测试 去正式实验室做一次预测试,取得频谱图;确定超标频点和超标量(备用)。 …

OpenCV中适用华为昇腾(Ascend)后端的逐元素操作(Per-element Operations)

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 针对华为昇腾(Ascend)后端的逐元素操作(Per-element Operations),这些操作通常用于图…

Web前端VSCode如何解决打开html页面中文乱码的问题(方法2)

Web前端—VSCode如何解决打开html页面中文乱码的问题(方法2) 1.打开VScode后,依次点击 文件 >> 首选项 >> 设置 2.打开设置后,依次点击 文本编辑器 >> 文件(或在搜索框直接搜索“files.autoGuessEnc…

【UltralyticsYolo11图像分类完整项目-04】代码重构

经过上一篇博客,我们实现 了一个cpp文件,可以预测单个图像和多个图像。为了更加简化代码,方便部署,我们需要对代码进行重构:将功能模块化到头文件中。 完整代码下载链接:点击这里 重构的优点 模块化设计:将不同功能分离到不同的类中,每个类有明确的职责更好的可维护性:…

Debezium RelationalSnapshotChangeEventSource详解

Debezium RelationalSnapshotChangeEventSource详解 1. 类的作用与功能 1.1 核心功能 RelationalSnapshotChangeEventSource是Debezium中用于关系型数据库快照的核心抽象类,主要负责: 数据快照:对数据库表进行全量数据快照模式捕获:捕获数据库表结构事务管理:确保快照过…

DeepInjectSQL - 基于 AI 生成对抗网络(GAN)的下一代 SQL 注入自动化漏洞猎手

概述 SQLMap本身是一个成熟的自动化SQL注入工具,可以与GAN结合起来,让GAN生成的Payload替代传统的手工或规则生成的测试用例,从而提高检测的覆盖率和效率。 分析可行性 GAN通常用于生成类似真实数据分布的数据,例如图片、文本等。…

Python 爬虫之 XPath 元素定位

XPath 简介 XPath (XML Path Language) 最初是为了在 XML 文档中进行导航而设计的语言,后来被广泛应用于 HTML 文档的解析。与 BeautifulSoup 相比,XPath 有以下特点: 语法强大:可以通过简洁的表达式精确定位元素跨平台性&#…

聊聊自动化办公未来趋势

1. 自动化办公未来趋势 1.1 智能化与AI融合加深 随着人工智能技术的不断成熟,其在自动化办公中的应用将更加广泛和深入。未来,办公软件将具备更强的智能交互能力,能够理解自然语言指令,自动完成复杂的任务,如文档编辑…

智慧工会服务平台建设方案Word(23页)

1. 引言 随着信息技术的快速发展,传统工会服务模式面临挑战,智慧工会服务平台应运而生。该平台旨在通过数字化手段,整合工会资源,优化服务流程,提高工作效率,为会员提供更加便捷、高效、个性化的服务体验。…

React Hooks 深入浅出

目录 引言:React Hooks 的革命基础 Hooks useState:状态管理的新方式useEffect:组件生命周期的替代方案useContext:简化 Context API 额外的 Hooks useReducer:复杂状态逻辑的管理useCallback 与 useMemo:…

【应急响应】- 日志流量如何分析?

【应急响应】- 日志流量如何下手?https://mp.weixin.qq.com/s/dKl8ZLZ0wjuqUezKo4eUSQ

stm32 debug卡在0x1FFFxxxx

自己画的一个四轴飞机电路板,之前还能debug,改了一下mos管两端的电阻,还能正常下载,蓝牙接收也正常,但是debug出问题了,刚下载就自动运行,然后程序就在0x1FFFxxxx附近循环运行,这一块…

java-----------------多态

多态,当前指的是 java 所呈现出来的一个对象 多态 定义 多态是指同一个行为具有多个不同表现形式或形态的能力。在面向对象编程中,多态通过方法重载和方法重写来实现。 强弱类型语言 javascript 或者python 是弱类型语言 C 语言,或者 C…

Java 23种设计模式 - 结构型模式7种

Java 23种设计模式 - 结构型模式7种 1 适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 优点 将目标类和适配者类解耦增加了类的透明性和复用性,将具体的实现封…

Git clone时出现SSL certificate problem unable to get local issuer certificate

正确解决方法 git config --global http.sslVerify false错误解决方法:(主要是看错了嘿嘿,但是如果是 OpenSSL SSL_read: Connection was reset, errno 10054 Failed to connect to github.com port 443: Timed out 原…

DevExpressWinForms-AlertControl-使用教程

文章目录 AlertControl-使用教程一、将 AlertControl 添加到 Form二、编辑 AlertControl 的 HtmlTemplateHTML Template Editor介绍编辑HTML Template 三、使用AlertControl弹出AlertAlert中的按钮事件获取 Alert 标题等信息向Alert传递参数 总结源码 AlertControl-使用教程 一…

制作项目进度表常用的 8 款项目管理工具分享

在数字化管理和高效协作的今天,项目进度表软件已经成为企业管理不可或缺的工具。无论是中小型企业还是大型机构,都需要通过精准的项目计划和实时的进度跟踪来确保业务目标的顺利达成。这篇文章将聚焦项目进度表软件,深入探讨市场上8款主流产品…

SecureCRT网络穿透/代理

场景 公司的办公VPN软件只有Windows系统版本,没有Macos系统版本,而日常开发过程中需要先登录VPN后,然后才能登录应用服务器。 目的:Macos系统在使用SecureCRT时,登录服务器,需要走Parallels Desktop进行网络…