当前位置: 首页 > web >正文

手撕红黑树的 左旋 与 右旋

一、为什么需要旋转?

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

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


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

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

三、🔄 左旋(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.xdnf.cn/news/5026.html

相关文章:

  • 全球首套100米分辨率城市与农村居住区栅格数据(2000-2020)
  • AI文旅|暴雨打造旅游新体验
  • 如何优化系统启动时间--基于米尔瑞萨MYD-YG2LX开发板
  • linux ptrace 图文详解(八) gdb跟踪被调试程序的子线程、子进程
  • Python 中方法命名中下划线的使用规则
  • 深入解析:思维链模型在大语言模型中的应用与实践
  • 力扣-21.合并两个有序链表
  • 抓取大站数据与反爬策略
  • 掌握单元测试:提升软件质量的关键步骤
  • 基于HTML+JavaScript+CSS实现教学网站
  • 免布线视频桩:智慧城市停车降本增效的破局利器
  • 进入虚拟机单用户模式(Linux系统故障排查)
  • 用前端视角理解 GraphQL 与 REST 的互补逻辑
  • AD原理图复制较多元器件时报错:“InvalidParameter Exception Occurred In Copy”
  • 神经元和神经网络定义
  • 设置GO程序在离线情况下读取本地缓存的模块
  • Rust 中的 Move、Copy 和 Clone:深度剖析
  • 深入探索Laravel框架中的Blade模板引擎
  • python中的celery和其他分布式任务队列
  • 数据结构每日一题day17(链表)★★★★★
  • 公开模型一切,优于DeepSeek-R1,英伟达开源Llama-Nemotron家族
  • Linux系统使用vscode格式化shell脚本
  • spring5.x讲解介绍
  • LeetCode-双指针-盛最多水的容器
  • Power Apps:Patch函数添加人员或组列的项
  • 在js中大量接口调用并发批量请求处理器
  • Node.js 24.0 正式发布:性能跃升与开发体验全面升级
  • FPGA:如何提高RTL编码能力?
  • p2p虚拟服务器
  • SSTI模版注入