【图文详解】彻底了解红黑树底层实现原理

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

红黑树定义

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。(来源百度百科)

结构特点

特性

是一种 自平衡 的二叉树,所谓的自平衡是指在插入和删除的过程中,红黑树会采取一定的策略对树的组织形式进行调整,以尽可能的减少树的高度,从而节省查找的时间。

红黑树的特性如下:

  1. 结点是红色或黑色

  2. 根结点始终是黑色

  3. 叶子结点(NIL 结点)都是黑色

  4. 红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续的红色结点)

  5. 从任一结点到每个叶子的所有简单路径都包含相同数目的黑色结点

以上性质保证了红黑树在满足平衡二叉树特征的前提下,还可以做到 从根到叶子的最长路径最多不会超过最短路径的两倍 ,这主要是考虑两个极端的情况,由性质 4 和 5 我们可以知道在一棵红黑树上从根到叶子的最短路径全部由黑色结点构成,而最长结点则由红黑结点交错构成(始终按照一红一黑的顺序组织),又因为最短路径和最长路径的黑色结点数目是一致的,所以最长路径上的结点数是最短路径的两倍。

自平衡策略

对于一棵红黑树的操作最基本的无外乎增删改查,其中查和改都不会改变树的结构,所以与普通平衡二叉树操作无异。剩下的就是增删操作,插入和删除都会破坏树的结构,不过借助一定的平衡策略能够让树重新满足定义。平衡策略可以简单概括为三种: 左旋转右旋转 ,以及 变色 。在插入或删除结点之后,只要我们沿着结点到根的路径上执行这三种操作,就可以最终让树重新满足定义。

  • 左旋转

对于当前结点而言,如果右子结点为红色,左子结点为黑色,则执行左旋转,如下图

  • 右旋转 

对于当前结点而言,如果左子、左孙子结点均为红色,则执行右旋转,如下图:

  •  变色

对于当前结点而言,如果左、右子结点均为红色,则执行变色,如下图:

 插入操作

红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位插入点,不过红黑树约定新插入的结点一律为红色,这主要也是为了简化树的自平衡过程。对于一棵空树而言,插入结点为红色会增加一次变色操作,但是对于其余的情况,如果插入的结点是一个黑色结点,那么必然会破坏性质 5,而插入一个红色结点有可能会破坏性质 4,但是此时我们可以通过简单的策略对树进行调整以重新满足定义。

约定 X 为插入的结点,P 为 X 的父结点,G 为 X 的祖父结点,U 为 X 的叔叔结点。

  • 1.新插入结点 X 是根结点

此时新插入结点为红色,违背性质 2,只需将其变为黑色即可

  •  2.新插入结点 X 的父结点 P 是黑色

 此时需要依据新插入结点 X 值相对于父结点 P 的大小分为两种情况,如果小于则将 X 简单插入到 P 的左子位置即可(下图左),如果 X 的值大于 P,则需要将 X 插入到 P 的右子结点位置,然后执行一次左旋转即可(下图右)。

  •  3.父结点 P 为红色,同时存在叔叔结点 U 也为红色

因为 P 为红色,按照性质 4 则 G 必定为黑色,如果 X 的值小于 P,则需要在 P 的左子位置插入(如下图),插入后不满足性质 4,此时只需要执行一次变色操作,将 P、G、U 的颜色反转一下即可,因为 G 变为红色,所以路径长度减 1,但是因为 P 和 U 都变为了黑色,所以路径长度又加 1,最终长度不变,但此时 G 变为了红色,所以需要继续向上递归。

 如果 X 的值大于 P,则需要在 P 的右子位置插入(如下图),插入后不满足性质 4,此时需要先执行左旋转变为上面这种情况,继续变色即可。

  •  4.父结点 P 为红色,同时叔叔结点 U 为黑色或不存在

因为 P 为红色,按照性质 4 则 G 必定为黑色,如果 X 的值小于 P,则需要在 P 的左子位置插入(如下图),插入后不满足性质 4,此时需要先执行一次右旋转,旋转之后仍然违背性质 4,同时左子树的高度减 1,这个时候需要再执行一次变色操作即可满足定义。

 如果 X 的值大于 P,则需要在 P 的右子位置插入(如下图),插入后不满足性质 4,此时我们需要执行一次左旋转,然后就转换成了上面这种情况,继续右旋转、变色即可。

删除操作

红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位删除点,在执行删除之前我们需要判断待删除结点有几个孩子结点,如果是 2 个的话我们需要从结点的左子树中寻找值最大的结点,或者从右子树中寻找值最小的结点,并用结点值替换掉待删除结点(只要目标结点值从树上消失即可,不要纠结具体删除的是哪个结点)。这两个结点有一个共性,即最多只有一个孩子结点(因为已经是自己所处范围内的最大和最小了),此时就将需求转变成删除只有一个孩子结点的结点,相对要简单了许多。

约定 X 为待删除的结点,P 为 X 的父结点,S 为 X 的孩子结点,B 为 X 的兄弟结点,BL 为 B 的左孩子结点,BR 为 B 的右孩子结点。

  1. 如果待删除结点 X 是一个红色结点,则直接删除即可,不会违反定义。

  2. 如果待删除结点 X 是一个黑色结点,且其孩子结点 S 是红色的,那么只需要将 X 替换成 S,同时将 S 由红变黑即可。

  3. 如果需要删除的结点 X 是黑色的,同时它的孩子结点 S 也是黑色的,这种情况需要进一步分场景讨论。

 对于第三种情况我们首先将 X 替换成 S,并重命名其为 N,N 沿用 X 对于长辈和晚辈的称呼,需要清楚这里实际删除的是 X 结点,并且删除之后通过 N 的路径长度减 1。

  •  1.N 是新的根

这种情况比较简单,不需要再做任何调整。

  •  2.N 的父结点、兄弟结点 B,以及 B 的孩子结点均为黑色

如下图,此时只需要将 B 变为红色即可,这样所有通过 B 的路径减 1,与所有通过 N 的路径正好一致,但是此时通过 P 的路径都减少了 1 个长度,所以需要向上递归对结点 P 继续判定。

  •  3.N 的兄弟结点 B 为红色,其余结点均为黑色

如下图,此时需要执行一次左旋转,然后将 P 和 B 的颜色互换。调整前后各个结点的路径没有变化,但是因为之前经过 N 的路径长度少了一个单位,所以此时仍然不满足定义,需要按照后面的场景继续调整。

  •  4.N 的父结点 P 为红色,兄弟结点 B,以及 B 的孩子结点均为黑色

如下图,此时我们只需要简单互换 P 和 B 的颜色,这种情况下对于不通过 N 的结点路径没有影响,但是却让通过 N 的结点路径加 1,正好弥补之前删除操作所带来的损失。

  •  5.N 的兄弟结点 B 为黑色,B 的左孩子为红色,B 的右孩子为黑色

如下图,此时我们需要先执行一次右旋转操作,然后互换 B 与 BL 的颜色,操作之后通过所有结点的路径长度并没有发生变化,却让 N 有了一个新的黑色兄弟结点,并且该兄弟结点的右孩子为红色,从而可以按照接下去介绍的一种场景继续调整。

注:白色结点表示该结点既可以是黑色也可以是红色,后续图示亦是如此。

 

  •  6.N 的兄弟结点 B 为黑色,B 的右孩子为红色

如下图,此时我们需要先执行一次左旋转,并互换 P 和 B 的颜色,同时将 B 的右孩子结点变为黑色。变更之后,除 N 外其余结点的路径长度未发生变化,但是经过 N 的路径上却增加了一个黑色结点,这刚好弥补之前删除操作所带来的损失。


http://chatgpt.dhexx.cn/article/4a0cIXRT.shtml

相关文章

红黑树(一)之 原理和算法详细介绍

概要 目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 作者:Sky Wang 于 2013-08-08 概述:R-B Tree&#xff…

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

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

红黑树原理简单解析

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

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端口