红黑树原理讲解

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

红黑树原理讲解

  • 一、红黑树的性质
  • 二、红黑树的3种变化策略?(为满足红黑树性质)
    • 1. 改变颜色
    • 2. 左旋
    • 3. 右旋
  • 三、红黑树的插入
    • 情景1:红黑树为空树
    • 情景2:插入节点的key已经存在
    • 情景3:插入节点的父节点为黑色
    • 情景4:插入节点的父节点为红色
      • 情景4.1:叔叔节点存在,并且为红色(父-叔 双红)
      • 情景4.2:叔叔节点不存在,或者为黑色,父节点为爷爷节点的左子树
        • 情景4.2.1:插入节点为其父节点的左子节点(LL情况)
        • 情景4.2.2:插入节点为其父节点的右子节点(LR情况)
      • 情景4.3:叔叔节点不存在,或者为黑色,父节点为爷爷节点的右子树
        • 情景4.3.1:插入节点为其父节点的右子节点(RR情况)
        • 情景4.3.2:插入节点为其父节点的左子节点(RL情况)
  • 四、红黑树插入案例分析

介绍红黑树之前可以先了解一下二叉搜索树和AVL树,毕竟红黑树是为了弥补二叉搜索树的不足而诞生的嘛

一、红黑树的性质

  • 性质1:每个节点要么是黑色,要么是红色
  • 性质2:根节点是黑色
  • 性质3:每个叶子节点(NIL)是黑色
  • 性质4:每个红色节点的两个子节点一定都是黑色。不能有两个红色节点相连
  • 性质5:任意一节点到每个叶子节点的路径都包含数量相同的黑结点。俗称:黑高!
  • 性质5.1:如果一个节点存在黑子节点,那么该结点肯定有两个子节点

在这里插入图片描述

二、红黑树的3种变化策略?(为满足红黑树性质)

1. 改变颜色

结点的颜色由红变黑或由黑变红

2. 左旋

动图演示
在这里插入图片描述
静态图演示 在这里插入图片描述

3. 右旋

动态图演示
在这里插入图片描述

静态图演示
在这里插入图片描述

三、红黑树的插入

注意:

插入节点,必须为红色,理由很简单,红色在父节点(如果存在)为黑色节点时,红黑树的黑色平衡没被破坏,不需要做自平衡操作。
但如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。

在开始每个情景的讲解前,我们还是先来约定下:
在这里插入图片描述

情景1:红黑树为空树

最简单的一种情景,直接把插入结点作为根结点就行
注意:根据红黑树性质2:根节点是黑色。还需要把插入结点设为黑色

情景2:插入节点的key已经存在

更新当前节点的值,为插入节点的值
在这里插入图片描述

情景3:插入节点的父节点为黑色

由于插入的结点是红色的,并不会影响红黑树的平衡,直接插入即可,无需做自平衡
在这里插入图片描述

情景4:插入节点的父节点为红色

根据红黑树的性质2:根结点是黑色。如果插入节点的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。后续的旋转操作肯定需要祖父结点的参与
在这里插入图片描述

情景4.1:叔叔节点存在,并且为红色(父-叔 双红)

依据红黑树性质4可知,红色节点不能相连 ==> 祖父结点肯定为黑结点;
因为不可以同时存在两个相连的红结点。那么此时该插入子树的红黑层数的情况是:黑红红。显然最简单的处理方式是把其改为:红黑红
处理:
1.将P和U节点改为黑色
2.将PP改为红色
3.将PP设置为当前节点,进行后续处理
在这里插入图片描述
可以看到,我们把PP结点设为红色了,如果PP的父结点是黑色,那么无需再做任何处理;
但如果PP的父结点是红色,则违反红黑树性质了。所以需要将PP设置为当前节点,继续做插入操作自平衡处理,直到平衡为止

情景4.2:叔叔节点不存在,或者为黑色,父节点为爷爷节点的左子树

情景4.2.1:插入节点为其父节点的左子节点(LL情况)

在这里插入图片描述
处理:
1.变颜色:将P设置为黑色,将PP设置为红色
2.对PP节点进行右旋
在这里插入图片描述

情景4.2.2:插入节点为其父节点的右子节点(LR情况)

在这里插入图片描述
处理:
1.对P进行左旋
2.将P设置为当前节点,得到LL红色情况
3.按照LL红色情况处理(1.变颜色 2.右旋PP)
在这里插入图片描述

情景4.3:叔叔节点不存在,或者为黑色,父节点为爷爷节点的右子树

情景4.3.1:插入节点为其父节点的右子节点(RR情况)

在这里插入图片描述

处理:
1.变颜色:将P设置为黑色,将PP设置为红色
2.对PP节点进行左旋
在这里插入图片描述

情景4.3.2:插入节点为其父节点的左子节点(RL情况)

在这里插入图片描述
处理:
1.对P进行右旋
2.将P设置为当前节点,得到RR红色情况
3.按照RR红色情况处理(1.变颜色 2.左旋PP)
在这里插入图片描述

四、红黑树插入案例分析

把7插进红黑树
在这里插入图片描述
介绍了红黑树的理论,接下来就是手撕代码了
手写红黑树


http://chatgpt.dhexx.cn/article/6hWA7FQU.shtml

相关文章

红黑树原理详解

红黑树原理详解 红黑树的旋转红黑树上结点的插入红黑树上结点的删除 参考: 教你初步了解红黑树 红黑树(一)之 原理和算法详细介绍 红黑树定义: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。 [注意&…

红黑树原理

因为看的时候写在了纸上,于是直接扫描的,效果不太好。

HashMap红黑树原理解析

HashMap红黑树原理解析 定义: 简单来说红黑树是一种近视平衡二叉查找树,主要优点是”平衡”,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为log(n)。 下面先主要提一下红黑树…

红黑树的原理及实现

红黑树的原理及实现 一、什么是红黑树二、定义红黑树三、左旋和右旋四、红黑树插入节点 一、什么是红黑树 红黑树是一种特定类型的二叉树,它是在计算机科学中用来组织数据比如数字的块的一种结构。 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有…

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

红黑树定义 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操…

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

概要 目录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…