数据结构 | 【红黑树】图解原理

article/2025/11/3 15:50:34

今天我们要说的红黑树就是就是一棵非严格均衡的二叉树,均衡二叉树又是在二叉搜索树的基础上增加了自动维持平衡的性质,插入、搜索、删除的效率都比较高。红黑树也是实现 TreeMap 存储结构的基石。

红黑树就是非严格均衡的二叉搜索树。


一、红黑树规则特点

红黑树具体有哪些规则特点呢?具体如下:

  • 节点分为红色或者黑色。

  • 根节点必为黑色。

  • 叶子节点都为黑色,且为 null。

  • 连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点)。

  • 从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点。

  • 新加入到红黑树的节点为红色节点。

规则看着好像挺多,没错,因为红黑树也是均衡二叉树,需要具备自动维持平衡的性质,上面的 6 条就是红黑树给出的自动维持平衡所需要具备的规则。

我们看一看一个典型的红黑树到底是什么样儿?

 首先解读一下规则,除了字面上看到的意思,还隐藏了哪些意思呢?

 ①从根节点到叶子节点的最长路径不大于最短路径的 2 倍

怎么样的路径算最短路径?从规则 5 中,我们知道从根节点到每个叶子节点的黑色节点数量是一样的,那么纯由黑色节点组成的路径就是最短路径

什么样的路径算是最长路径?根据规则 4 和规则 3,若有红色节点,则必然有一个连接的黑色节点,当红色节点和黑色节点数量相同时,就是最长路径,也就是黑色节点(或红色节点)*2。

 ②为什么说新加入到红黑树中的节点为红色节点

从规则 4 中知道,当前红黑树中从根节点到每个叶子节点的黑色节点数量是一样的,此时假如新的是黑色节点的话,必然破坏规则。

但加入红色节点却不一定,除非其父节点就是红色节点,因此加入红色节点,破坏规则的可能性小一些,下面我们也会举例来说明。

什么情况下,红黑树的结构会被破坏呢?破坏后又怎么维持平衡,维持平衡主要通过两种方式【变色】和【旋转】,【旋转】又分【左旋】和【右旋】,两种方式可相互结合。

下面我们从插入和删除两种场景来举例说明。


二、 红黑树节点插入

 当我们插入值为 66 的节点时,红黑树变成了这样:

很明显,这个时候结构依然遵循着上述 6 大规则,无需启动自动平衡机制调整节点平衡状态。

如果再向里面插入值为 51 的节点,这个时候红黑树变成了这样:

 很明显现在的结构不遵循规则 4 了,这个时候就需要启动自动平衡机制调整节点平衡状态。

1、变色 

我们可以通过变色的方式,使结构满足红黑树的规则:

  • 首先解决结构不遵循规则 4 这一点(红色节点相连,节点 49-51),需将节点 49 改为黑色。

  • 此时我们发现又违反了规则 5(56-49-51-XX 路径中黑色节点超过了其他路径),那么我们将节点 45 改为红色节点。

  • 哈哈,妹的,又违反了规则 4(红色节点相连,节点 56-45-43),那么我们将节点 56 和节点 43 改为黑色节点。

  • 但是我们发现此时又违反了规则 5(60-56-XX 路径的黑色节点比 60-68-XX 的黑色节点多),因此我们需要调整节点 68 为黑色。

  • 完成!

最终调整完成后的树为:

但并不是什么时候都那么幸运,可以直接通过变色就达成目的,大多数时候还需要通过旋转来解决。

 如在下面这棵树的基础上,加入节点 65:

 插入节点 65 后进行以下步骤:

这个时候,你会发现对于节点 64 无论是红色节点还是黑色节点,都会违反规则 5,路径中的黑色节点始终无法达成一致,这个时候仅通过【变色】已经无法达成目的。

我们需要通过旋转操作,当然【旋转】操作一般还需要搭配【变色】操作。旋转包括【左旋】和【右旋】。

2、旋转

左旋:逆时针旋转两个节点,让一个节点被其右子节点取代,而该节点成为右子节点的左子节点。

左旋操作步骤如下:首先断开节点 PL 与右子节点 G 的关系,同时将其右子节点的引用指向节点 C2;然后断开节点 G 与左子节点 C2 的关系,同时将 G 的左子节点的应用指向节点 PL。

右旋:顺时针旋转两个节点,让一个节点被其左子节点取代,而该节点成为左子节点的右子节点。 

右旋操作步骤如下:首先断开节点 G 与左子节点 PL 的关系,同时将其左子节点的引用指向节点 C2;然后断开节点 PL 与右子节点 C2 的关系,同时将 PL 的右子节点的应用指向节点 G。

无法通过变色而进行旋转的场景分为以下四种:

左左节点旋转 

这种情况下,父节点和插入的节点都是左节点,如下图(旋转原始图1)这种情况下,我们要插入节点 65。

规则如下:以祖父节点【右旋】,搭配【变色】。

按照规则,步骤如下:

左右节点旋转

这种情况下,父节点是左节点,插入的节点是右节点,在旋转原始图 1 中,我们要插入节点 67。

规则如下:先父节点【左旋】,然后祖父节点【右旋】,搭配【变色】。

按照规则,步骤如下:

右左节点旋转

这种情况下,父节点是右节点,插入的节点是左节点,如下图(旋转原始图 2)这种情况,我们要插入节点 68。

规则如下:先父节点【右旋】,然后祖父节点【左旋】,搭配【变色】。

按照规则,步骤如下:

右右节点旋转

这种情况下,父节点和插入的节点都是右节点,在旋转原始图 2 中,我们要插入节点 70。

规则如下:以祖父节点【左旋】,搭配【变色】。

按照规则,步骤如下:

红黑树插入总结如下图:


作者:梁洪  来源:51CTO技术栈

彻底搞懂红黑树 - 知乎 


http://chatgpt.dhexx.cn/article/swTfOIo3.shtml

相关文章

红黑树原理简单解析

一、红黑树为什么会出现呢? 是因为二叉搜索树有可能会出现极端的情况,就是只有一侧有数据,那这样的话就会降级为链表。后来出现了平衡二叉树,但是由于强制平衡所导致付出的代价比较高昂,所以黑红树出现了。 二、简介…

laravel框架的下载与安装

首先我们先访问这个网址https://github.com/laravel/laravel 可以使用git克隆 或者直接下载安装包到自己的www目录下解压,此时访问localhost下的laravel目录, 此时会报没有vendor文件夹的一个错, 如果你已经下载了composer 在该文件夹目录下…

Laravel

Laravel的安装 1.确认composer已经安装 2.配置homestead.yaml文件sites:- map: laravel.xyz//域名配置to: /home/vagrant/code/laravel/public//入口文件路径 databases://数据库- laravel 3.用秘钥登录homestead 4.更换中国镜像: composer…

Laravel下载文件及文档

2019独角兽企业重金招聘Python工程师标准>>> Laravel学院提供的相关资源下载 中文文档 Laravel 5.6 中文文档:PDF(兼容 5.5 文档) Laravel 5.3 中文文档:CHM | PDF Laravel 5.2 中文文档:CHM | PDF Laravel…

Laravel-admin的安装步骤

1、先确保是否安装composer,laravel及其版本并切换到阿里镜像 composer -v 查看composer的版本 php artisan 查看laravel的版本 扩展说明下:如果已经安装好composer,也可以通过 Composer 安装 Laravel 安装器 命令如下:composer…

如何正确的下载安装使用别人的laravel项目?

转载的,写的很简洁明了,白俊瑶博客 laravel 作为最流行的 php 框架;自然少不了很多基于 laravel 开发的项目;不过很多项目因为还处于开发中;或者其他原因并没有写安装文档;举个反面栗子;比如说我的 laravel-bjyadmin ;…

laravel 5.0

1.应用场景 使用PHP5.4[因为php5.4只能最高支持laravel 5.0]快速开发/维护一个web系统 2.学习/操作 1.获取参数 get方式 【查询字符串方式:Query String】 http://test.oa.com/api/u2d/texture/export?nametest&sex男 Route::get(export, U2dTextureControll…

Laravel最新版的安装(图文)

本文只适合刚接触或者想学Laravel的小白,老鸟就自动略过吧。 Laravel是一套简洁、优雅的PHP WEB开发框架(PHP Web Framework),具有富于表达性且简洁的语法,Laravel是易于理解且强大的,它提供了强大的工具用…

Laravel 安装

工作需要,得学习一个php的后台admin管理框架,用于管理内容。这一天都在搜GitHub和gitee,GitHub是真的难访问啊,时断时续的;gitee上有一些,但好多都停更了的样子,有一些还不错的,例如…

Laravel 8 文件的上传/下载/显示的实例

如何实现对文件的操作,实现上传,下载,展示等等功能,我们通过编写一个简单的实例来了解其中具体的内容。 文件列表的展示/文件上传/文件下载 首先我们需要创建两个文件,一个视图文件,一个控制器&#xff0c…

安装laravel

安装laravel之前首先应该设置好安装好php,配置好环境变量。之后安装好compser。 1、安装php环境变量。 我使用的php环境安装包是upupw,(php环境安装包有很多,例如phpstudy,wamp等等,读者可自行百度。&…

Laravel框架 -- 文件下载功能

Laravel 文件下载功能,通过手册,我们可以发现,Response的download方法就是我们所需要的文件下载功能的重要元素。 首先,我们注意一下,上面的方法中有两种写法,那么我以第二种为例子,解释一下实际…

laravel安装

文章目录 前言一、下载composer二、安装composercmd 输入composer 检验 三、配置镜像第一步第二步 四、虚拟目录配置 前言 前提:安装了phpStudy套件。https://www.xp.cn/download.html 一、下载composer 从laravel5.x 开始 , 官网https://getcomposer.org/Compose…

laravel文件上传与下载

https://github.com/Chumper/Zippergithub地址 composer require chumper/zipper看到这个代表安装成功 代表路由 . . . // package chumper/zipper Route::get(zip, ZipControllerindex)->name(zip.index); Route::post(zip/download, ZipControllerdownload)->name(zi…

Laravel 5.7下载、安装

本地安装laravel,php环境要配置好,推荐xmapp一键搭建。 1、程序包直接从官方下载,官方开源地址:https://github.com/laravel/laravel(当然也可从此网站:http://www.golaravel.com/download/ 下载一键安装包,下载下来就…

【laravel】laravel的下载安装

下载 Laravel Laravel 利用 Composer(Composer 中文)来管理其自身的依赖包。因此,在使用 Laravel 之前,请务必确保在你的机器上已经安装了 Composer 。 上面是laravel中文对于如何安装使用laravel的官方解释,不同于大多…

IE浏览器不能访问其他浏览器能正常访问

IE浏览器不能访问 而其他浏览器能正常访问 解决方法 -重置 1 win x 键,然后点击 windows powerShell (以管理员方式运行) 2 输入下面2条命令,记得回车 Netsh winsock resetnetsh advfirewall reset如下图所示: 运行…

浏览器访问Linux的Tomcat

浏览器访问Linux的Tomcat 1、在Linux下启动tomcat服务器 2、打开防火墙,开放8080端口

浏览器访问网页流程

从我们输入URL并按下回车键到看到网页结果之间发生了什么?换句话说,一张网页,要经历怎样的过程,才能抵达用户面前?下面来从一些细节上面尝试一下探寻里面的秘密。 前言:键盘与硬件中断 说到输入URL&#…

浏览器HTTPS访问问题

1、问题描述 搭建了HTTPS服务环境 https://172.16.0.17 ,用浏览器访问时,出现提示信息: “您的连接不是私密连接”(Chrome),如下图所示 “您的链接并不安全”(Firefox)&#xff0…