【算法笔记】红黑树插入操作

红黑树插入与调整详解

一、红黑树的五大性质

红黑树是一种自平衡的二叉搜索树(BST),其核心特性如下:

  1. 颜色属性:每个节点非红即黑
  2. 根属性:根节点必须为黑色
  3. 叶子属性:所有的 NIL 叶子节点都是黑色
  4. 红节点约束:红色节点的子节点必须为黑色(即无连续红节点
  5. 黑高平衡:从任一节点到其所有后代叶子节点的路径中,黑色节点数量相等

二、插入操作流程

阶段 1:标准 BST 插入

  • 从根节点开始查找插入位置
  • 新节点总是红色
  • 按照 BST 规则插入

阶段 2:平衡修复(重点)

当插入后新节点的父节点是红色时,需要进行结构调整。核心考量因素:

  • 父节点是祖父的左孩子还是右孩子
  • 叔叔节点的颜色
  • 新节点的插入方向(左/右)

三、调整情况详解

情况分类表

父节点位置叔叔颜色插入方向操作类型案例编号
左子树-重新着色Case 1
左子树右孩子左旋Case 2
左子树左孩子右旋 + 变色Case 3
右子树-重新着色Case 1’
右子树左孩子右旋Case 2’
右子树右孩子左旋 + 变色Case 3’

详细调整步骤(以父节点为左孩子为例)

Case 1:叔叔为红色
  • 父节点、叔叔设为黑色
  • 祖父节点设为红色
  • 将祖父节点作为新节点,递归向上调整
Case 2:叔叔为黑且新节点是右孩子
  • 以父节点为支点进行左旋
  • 转换为 Case 3 处理
Case 3:叔叔为黑且新节点是左孩子
  • 父节点设为黑色
  • 祖父节点设为红色
  • 以祖父节点为支点进行右旋

父节点为右孩子的情况完全对称。


四、记忆技巧与口诀

三步判断法

  1. 看颜色:父节点为红色才需要调整
  2. 查叔叔:查看叔叔节点颜色
  3. 辨方向:判断新节点是左插还是右插

核心口诀

红叔变色向上传,
黑叔旋转看方向;
先左后右调平衡,
黑高不变记心上。

颜色标记法

  • 红色节点:可能引发冲突
  • 黑色节点:安全、稳定
  • 新插入节点:总是红色

五、代码实现框架

def insert_fixup(tree, z):while z.parent.color == RED:if z.parent == z.parent.parent.left:uncle = z.parent.parent.rightif uncle.color == RED:  # Case 1z.parent.color = BLACKuncle.color = BLACKz.parent.parent.color = REDz = z.parent.parentelse:if z == z.parent.right:  # Case 2z = z.parentleft_rotate(tree, z)# Case 3z.parent.color = BLACKz.parent.parent.color = REDright_rotate(tree, z.parent.parent)else:# 对称处理:父节点为右孩子uncle = z.parent.parent.leftif uncle.color == RED:  # Case 1'z.parent.color = BLACKuncle.color = BLACKz.parent.parent.color = REDz = z.parent.parentelse:if z == z.parent.left:  # Case 2'z = z.parentright_rotate(tree, z)# Case 3'z.parent.color = BLACKz.parent.parent.color = REDleft_rotate(tree, z.parent.parent)tree.root.color = BLACK

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

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

相关文章

认知计算革命:从算法创新到产业落地的AI专业核心应用全景

​​一、自动化机器学习(AutoML)​​ ​​技术机理与产业实践深度剖析​​ ​​神经网络架构搜索(NAS)​​ 强化学习方案:Google Brain的NASNet采用策略梯度优化卷积单元进化算法方案:DeepMind的AmeobaNe…

篇章十 论坛系统——业务开发——板块和帖子

目录 1.板块 1.1 思路 1.2 实现逻辑 1.3 参数要求 1.4 实现步骤 1.Mapper.xml 2.Mapper.java 3.Service接口 4.Service实现 5.单元测试 6.Controller 7.测试API 8.前后端交互 2.帖子 1.1思路​编辑 1.2 参数要求 ​编辑 1.3 实现步骤 1.Mapper.xml 2.Mapper…

React Native 上线前的准备与企业实战经验总结

上线前的准备与企业实战经验总结 关键要点 热更新简化部署:CodePush 和 Expo OTA 允许快速推送 JavaScript 和资源更新,绕过应用商店审核,适合修复 Bug 或小规模功能迭代。监控与分析提升质量:Sentry 提供实时错误跟踪&#xff…

【AI时代速通QT】第一节:C++ Qt 简介与环境安装

目录 前言 一、为什么是 Qt?—— C 开发者的必备技能 二、Qt 的核心魅力:不止于跨平台 2.1 优雅之一:代码隔离,清晰明了 2.2 优雅之二:信号与槽(Signal & Slot)机制 2.3 优雅之三&…

pandas学习笔记

前言 总结才是知识,作者习惯不好,不会总结,导致函数一旦不使用就会忘记怎么使用,特此写了本文,用于给自己一个复习的资料. 提示:如果你是小白,每个代码请自己敲打。 一 pandas的介绍 Pandas is…

算法题(力扣每日一题)—改变一个整数能得到的最大差值

给你一个整数 num 。你可以对它进行以下步骤共计 两次&#xff1a; 选择一个数字 x (0 < x < 9). 选择另一个数字 y (0 < y < 9) 。 数字 y 可以等于 x 。 将 num中所有出现 x 的数位都用 y 替换。 令两次对 num 的操作得到的结果分别为 a 和 b 。 请你返回 a 和 b…

Kubernetes笔记

1.简介 Kubernetes的本质是一组服务器集群&#xff0c;它可以在集群的每个节点上运行特定的程序&#xff0c;来对节点中的容器进行管理。目的是实现资源管理的自动化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修复&#xff1a;一旦某一个容器崩溃&#xff0c;能够…

Flutter——数据库Drift开发详细教程(八)

目录 自定义 SQL 类型定义类型使用自定义类型在 Dart 中在 SQL 中 方言意识支持的 SQLite 扩展json1fts5地缘垄断 自定义 SQL 类型 Drift 的核心库主要以 SQLite3 为目标平台编写。这体现在Drift 开箱即用的SQL 类型上——这些类型由 SQLite3 支持&#xff0c;并新增了一些由 …

安卓远控工具 CRaxsRat v7.6 安装与使用教程(仅供合法测试学习)

在当今的信息安全领域&#xff0c;移动设备已成为重点关注对象。本文将介绍一款用于远程管理与教学研究的工具 —— CRaxsRat v7.6&#xff0c;并详细讲解其安装与使用流程。本教程仅供网络安全爱好者在合法授权环境下学习使用&#xff0c;严禁任何非法用途。 &#x1f50d; 一…

容器的本质是进程

前言 Linux 容器的本质&#xff0c;是一个被隔离和限制的进程。 与虚拟机不同&#xff0c;容器无需虚拟化一个完整的操作系统&#xff0c;所以它比虚拟机更轻量级&#xff0c;效率也更高。 Linux 容器通过 namespaces 技术来隔离容器的视图&#xff0c;使得容器进程只能看到…

LeetCode 第75题:颜色分类

给定一个包含红色、白色和蓝色、共n个元素的数组nums&#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排序。 使用整数0、1和2分布表示红色、白色和蓝色。 必须在不使用库内置sort函数的情况下解决这个问题。 示例1&a…

PHP基础-函数

函数是一段可重复使用的代码块&#xff0c;可以将一系列操作封装起来&#xff0c;使代码更加模块化、可维护和可重用&#xff0c;来大大节省我们的开发时间和代码量&#xff0c;提高编程效率。在PHP中你可以使用&#xff1a; 内置函数&#xff08;如 strlen()、array_merge()&a…

【FastAPI高级实战】结合查询参数与SQLModel Joins实现高效多表查询(分页、过滤、计数)

想象一下&#xff0c;你正在开发一个超酷的Web应用&#xff0c;比如一个博客平台或者一个在线商店。你的API不仅要能把数据&#xff08;比如文章列表、商品信息&#xff09;展示给用户&#xff0c;更要聪明到能理解用户的各种“小心思”&#xff1a;用户可能想看最新的文章、搜…

华为OD-2024年E卷-通过软盘拷贝文件[200分] -- python

问题描述&#xff1a; 有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。但此电脑除了有一个3.5寸软盘驱动器以外&#xff0c;没有任何手段可以将文件持贝出来&#xff0c;而且只有一张软盘可以使用。因此这一张软盘是唯一可以用来拷贝文件的载体。科学家想要…

Keepalived 高可用,nginx + keepalived , lvs + keepalived、 数据库+keepalived

keepalived 官网 Keepalived 可以用来防止服务器单点故障的发生 # 原理 是基于VRRP协议实现的&#xff0c;当backup收不到vrrp包时&#xff0c;就认为master宕机了&#xff0c;这时就需要根据VRRP的优先级来选举一个backup 当master&#xff0c;就实现服务的HA&#xff08;高…

开疆智能Devicenet转ModbusTCP网关连接台达从站通讯模块配置案例

本案例是通过开疆智能Devicenet转ModbusTCP网关连接台达Devicenet从站通讯模块DVPDT02-H2的配置案例&#xff0c;网关作为ModbusTCP服务器和Devicenet主站&#xff0c;连接台达Devicenet从站&#xff0c; 配置过程&#xff1a; 首先配置Devicenet从站&#xff0c;先设置从站De…

网络NAT是什么

网络NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是一种用于计算机网络中的技术&#xff0c;主要目的是在私有网络与公有网络&#xff08;比如互联网&#xff09;之间转换IP地址&#xff0c;实现私有网络中的多台设备通过一个公网IP访问外…

React状态管理——react-redux

目录 一、redux介绍 二、安装 三、基本实现步骤 3.1 创建Action Types 3.2 创建counterAction 3.3 创建counterReducer 3.4 结合所有Reducer 3.5 创建store 3.6 入口文件中提供store 3.7 在组件中的使用 3.8 使用thunk实现异步支持 3.8.1 安装 3.8.2 在counterAct…

Java 零工市场小程序 | 灵活就业平台 | 智能匹配 | 日结薪系统 | 用工一站式解决方案

在就业形势如此严峻的情况下&#xff0c;很多小伙伴都会选择零工的工作方式来赚取外快&#xff0c;很多用人单位也会因为职为短暂空缺或是暂时人手不够而选择招用兼职人员。 而Java 作为企业级开发的主流语言&#xff0c;以其卓越的性能和稳定性著称。把零工的需求&#xff08…

数据可视化——一图胜千言

第04篇&#xff1a;数据可视化——一图胜千言 写在前面&#xff1a;大家好&#xff0c;我是蓝皮怪&#xff01;前面几篇我们聊了统计学的基本概念、数据类型和描述性统计&#xff0c;这一篇我们要聊聊数据分析中最直观、最有趣的部分——数据可视化。你有没有发现&#xff0c;很…