算法基础 -- 红黑树初识

红黑树初识

红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,它通过对每个节点增加颜色属性,以及在插入和删除节点时使用特定规则调整树结构来保持平衡。红黑树的特点是,在任何情况下,其树高都可以保持在 (O(\log n)) 的级别,从而确保了高效的查找、插入和删除操作。


红黑树的五大性质

  1. 节点颜色:每个节点要么是红色,要么是黑色
  2. 根节点为黑色:树的根节点始终是黑色。
  3. 叶子节点为黑色:所有叶子节点(NIL,哨兵节点)都是黑色。
  4. 红色节点不能相邻:红色节点的子节点必须是黑色(即不能有两个连续的红色节点)。
  5. 每个节点到其后代叶子的黑色节点数相同:对于任意节点,从该节点到叶子的所有路径上,黑色节点的数量相同,这一性质确保了红黑树的平衡性。

红黑树的操作

1. 查找(Search)

查找操作与普通的二叉搜索树相同,根据键值大小递归或迭代寻找目标节点。由于红黑树具有自平衡特性,查找的时间复杂度为 (O(\log n))。

2. 插入(Insertion)

红黑树插入新节点的过程分为两步:

  1. 按照普通二叉搜索树的规则插入新节点,初始将新节点设为红色
  2. 根据红黑树的五大性质,对树结构进行修复,确保红黑性质不被破坏。

插入操作可能触发以下三种修复情况:

Case 1:叔节点是红色

如果新节点的父节点和叔节点均为红色:

  1. 将父节点和叔节点涂黑。
  2. 将祖父节点涂红。
  3. 将祖父节点作为新节点,继续向上检查修复。
Case 2:叔节点是黑色,且新节点是右子节点

如果新节点的父节点是红色,叔节点是黑色,且新节点是右子节点:

  1. 对父节点进行左旋,将新节点调整到外侧。
  2. 转化为 Case 3。
Case 3:叔节点是黑色,且新节点是左子节点

如果新节点的父节点是红色,叔节点是黑色,且新节点是左子节点:

  1. 对祖父节点进行右旋。
  2. 交换祖父节点和父节点的颜色。

3. 删除(Deletion)

删除操作首先按普通二叉搜索树规则找到目标节点,然后:

  1. 如果删除的节点是红色:直接删除。
  2. 如果删除的节点是黑色:会破坏黑高平衡,需要进行修复。

删除操作的修复场景包括以下四种:

Case 1:兄弟节点是红色
  1. 将兄弟节点涂黑,父节点涂红。
  2. 对父节点进行旋转。
  3. 转化为其他情况处理。
Case 2:兄弟节点是黑色,且兄弟的两个子节点均为黑色
  1. 将兄弟节点涂红。
  2. 将父节点作为新节点,向上递归修复。
Case 3:兄弟节点是黑色,兄弟的左子节点是红色,右子节点是黑色
  1. 将兄弟节点涂红,兄弟的左子节点涂黑。
  2. 对兄弟节点进行右旋。
  3. 转化为 Case 4。
Case 4:兄弟节点是黑色,兄弟的右子节点是红色
  1. 将兄弟节点的颜色设置为父节点的颜色。
  2. 将父节点涂黑,兄弟的右子节点涂黑。
  3. 对父节点进行旋转,修复完成。

插入操作示例

以插入以下节点序列为例:[7, 3, 18, 10, 22, 8, 11, 26, 2, 6, 13]

初始插入

  1. 插入 7:树为空,7 作为根节点,设为黑色。
  2. 插入 3:3 小于 7,挂到左侧,设为红色。
  3. 插入 18:18 大于 7,挂到右侧,设为红色。

修复插入冲突

  1. 插入 10:10 < 18,挂到 18 左侧;10 为红色,与父节点 18 同为红色,触发 Case 1。
    • 祖父节点 7 变红,父节点 18 和叔节点 3 变黑。
    • 根节点 7 重新涂黑。
  2. 插入 22:直接插入,无需修复。
  3. 插入 8:8 挂到 10 左侧,触发 Case 2 -> Case 3。
    • 左旋父节点 10,将 8 调整为外侧。
    • 右旋祖父节点 18,完成修复。

删除操作示例

以删除以下节点为例:[18, 3]

删除 18

  1. 删除后,18 的后继节点(或直接替换节点)补位。
  2. 如果删除的节点是黑色,触发 Case 1~4 中的修复规则,最终平衡树。

删除 3

  1. 删除 3,修复兄弟节点颜色冲突。
  2. 如果兄弟节点为黑色,且其子节点为黑色,触发 Case 2。
  3. 递归向上调整,直到根节点或不再有冲突。

红黑树的实现与优化

  1. 工程应用
    • C++ 的 std::mapstd::set
    • Java 的 TreeMapTreeSet
  2. 红黑树 vs AVL 树
    • AVL 树高度更严格平衡,查询性能稍优。
    • 红黑树插入、删除效率更高,工程中更常用。

总结

红黑树的核心是通过“颜色约束”和“旋转”保持平衡,插入与删除的修复逻辑基于几种典型场景(Case 1~4)。虽然实现上需要细心处理,但由于其高效的时间复杂度和广泛的工程应用价值,红黑树是二叉搜索树中非常重要的一种变体。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法】8----四数之和

有看过我上篇算法博客并且去做过的铁子们&#xff0c;对这道题的话应该就不会那么陌生了&#xff0c;因为这两道题 的解题思路有着异曲同工之妙~ -----------------------------------------begin------------------------------------- 题目解析&#xff1a; 跟三数之和就多了…

安卓日常问题杂谈(一)

背景 关于安卓开发中&#xff0c;有很多奇奇怪怪的问题&#xff0c;有时候这个控件闪一下&#xff0c;有时候这个页面移动一下&#xff0c;这些对于快速开发中&#xff0c;去查询&#xff0c;都是很耗费时间的&#xff0c;因此&#xff0c;本系列文章&#xff0c;旨在记录安卓…

Python3 OS模块中的文件/目录方法说明九

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法&#xff1a;os.pipe() 方法、os.popen() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.pipe() 方法 os.pipe() 方法用于创建一个管道, 返回…

2025.1.20——四、[强网杯 2019]Upload1 文件上传|反序列化

题目来源&#xff1a;buuctf [强网杯 2019]Upload 1 目录 一、打开靶机&#xff0c;查看信息 二、解题思路 step 1&#xff1a;登陆进去看情况 step 2&#xff1a;大佬来支援——问题在cookie step 3&#xff1a;测试两个思路 1.目录穿越 2.目录扫描 step 4&#xff…

Go学习:iota枚举

iota注意事项&#xff1a; iota&#xff1a;常量自动生成器&#xff0c;每隔一行&#xff0c;自动累加iota给常量赋值使用iota 遇到 const&#xff0c;重置为 0可以只写一个iotaiota如果是同一行&#xff0c;值都一样 简单代码&#xff1a; package mainimport "fmt&qu…

2025 OWASP十大智能合约漏洞

随着去中心化金融&#xff08;DeFi&#xff09;和区块链技术的不断发展&#xff0c;智能合约安全的重要性愈发凸显。在此背景下&#xff0c;开放网络应用安全项目&#xff08;OWASP&#xff09;发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

双指针+前缀和习题(一步步讲解)

前言&#xff1a;如果解决下面这几道题有些问题&#xff0c;或者即使看了我画的过程图也不理解的可以去看看我的上一篇文章&#xff0c;有可能会对你有帮助。 一、《数值元素的目标和》---来自AcWing 数组元素的目标和 给定两个升序排序的有序数组 A和 B&#xff0c;以及一个…

单路由及双路由端口映射指南

远程登录总会遇到登陆不上的情况&#xff0c;可能是访问的大门没有打开哦&#xff0c;下面我们来看看具体是怎么回事&#xff1f; 当软件远程访问时&#xff0c;主机需要两个条件&#xff0c;一是有一个唯一的公网IP地址&#xff08;运营商提供&#xff09;&#xff0c;二是开…

Addressable学习

AssetsBundle是Unity的资源管理机制,将资源打包到AssetsBundle资源包并提供接口能从ab包里面加载资源出来。有了这个机制以后&#xff0c;我们要做资源管理&#xff0c;还需要做: a: 根据项目需求,编写编辑器扩展,提供指定资源打入对应bundle包工具策略; b: 根据项目的需求,资源…

大华相机DH-IPC-HFW3237M支持的ONVIF协议

使用libONVIF C库。 先发现相机。 配置 lib目录 包含 编译提示缺的文件&#xff0c;到libonvif里面拷贝过来。 改UDP端口 代码 使用msvc 2022的向导生成空项目&#xff0c;从项目的main示例拷贝过来。 CameraOnvif.h #pragma once#include <QObject> #include &l…

leetcode刷题记录(八十六)——84. 柱状图中最大的矩形

&#xff08;一&#xff09;问题描述 84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09;84. 柱状图中最大的矩形 - 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求在该柱状图中&#xff0c;能够勾…

centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐

环境&#xff1a;centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…

SpringBoot 实现动态管理定时任务 Job的动态操作(添加、修改、启停、执行、删除)以及界面展示和具体Job的创建与执行示例

SpringBoot 实现动态管理定时任务 Job的动态操作&#xff08;添加、修改、启停、执行、删除&#xff09;以及界面展示和具体Job的创建与执行示例 关键接口类&#xff1a; CronTaskRegistrar SchedulingRunnable . 添加定时任务注册类&#xff0c;用来增加、删除定时任务 impo…

LLMs的星辰大海:大语言模型的前世今生

文章目录 一. LLM 的演进&#xff1a;从规则到智能的跃迁 &#x1f4ab;1.1 语言模型的蹒跚起步 &#x1f476;1.2 RNN 与 LSTM&#xff1a;序列建模的尝试 &#x1f9d0;1.3 Transformer 的横空出世&#xff1a;自注意力机制的革命 &#x1f4a5;1.4 LLM &#xff1a;从预测到…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

flutter_学习记录_00_环境搭建

1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的&#xff0c;iOS开发&#xff0c;所以iOS开发环境本身是可用的&#xff1b;外加Mac电脑本身就会配置Java的环境。所以&#xff0c;后面剩下的就是&#x…

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…

困境如雾路难寻,心若清明步自轻---2024年创作回顾

文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份&#xff0c;我已写下一篇《近一年多个人总结》&#xff0c;当时还没开始写博客。四月份写博后&#xff0c;就顺手将那篇总…

综合与时序分析的设计约束(1)——静态时序分析简介

目录 1.绪论2.静态时序分析与动态时序分析3.时序约束在静态时序分析中的作用3.1.约束作为声明3.2. 约束作为断言3.3.约束作为指令3.4.约束作为异常3.5.约束的角色变化 4.STA需要正确约束5.时序路径起点和终点6.建立与保持6.1 建立时间6.2 保持时间6.3 裕度 7.SDC主要类型7.1 时…