数据结构-红黑树原理分析

article/2025/11/3 7:55:58

前言

在阅读HashMap源码的时候发现,java1.8的HashMap的链表实现增加了红黑树,当链表长度超过指定阈值8的时候回进行树化。
为了提高增删查的效率。
而红黑树又比较复杂,所以专门写一篇关于红黑树的文章。

概念

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,是一种特殊的二叉查找树。红黑树的每个结点上都有存储位表示结点的颜色, 可以是红(Red)或黑(Black)。
了解一下百度给出的红黑树概念:
摘自百度:
      红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
在了解红黑树之前,先了解一下AVL树: AVL树
红黑树的统计功能要好于AVL树,因为AVL是严格平衡的,红黑树是黑平衡的,维持平衡需要额外的操作。

应用

  • C++的STL,map和set都是用红黑树实现的。

  • 著名的linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块。

  • epoll在内核中的实现,用红黑树管理事件块。

  • nginx用红黑树管理timer等。

  • Java的TreeMap实现。

性质

红黑树不仅是自平衡二叉树还满足5个性质:
1)每个结点或红或黑
2)根结点是黑色
3)空叶子结点是黑色
4)如果一个结点是红色,那么它的子节点是黑色
5)从任意一个结点出发到空的叶子结点经过的黑结点个数相同
为了满足这五个性质,对于平衡二叉树的插入,删除就多增加了一些操作,
左旋,右旋,变色

  • 左旋
    以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,其左子结点保持不变
    如图:
    图片来自https://blog.csdn.net/sun_tttt/article/details/65445754
  • 右旋
    以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,其右子结点保持不变。
    如图:
    图片来自https://blog.csdn.net/sun_tttt/article/details/65445754

操作

  • 插入
    插入节点面临的情况:
    1.树为空,插入的结点为根结点
    直接将插入的结点变成黑色

    在这里插入图片描述
    2.父亲结点为黑色结点
    不需要任何操作,直接插入89就可以了。
    在这里插入图片描述
    3.父亲结点为红色结点的情况下:
    3.1 叔叔节点为黑色的情况(叔叔节点不存在即为黑色)
    3.1.1 父亲结点为右孩子,插入结点为左孩子
    针对父结点进行右旋,此时右旋后的情况必定是3.1.3的情况,然后按照3.1.3的情况处理;
    在这里插入图片描述在这里插入图片描述
    如图插入80以后变成这样了,按照上面的结论,先将80和89以89结点进行右旋,右旋后80变89的父节点,89为80的右孩子结点,此时的情况就是3.1.3情况,进行操作,将80和56颜色互换,然后对56进行左旋。此时就是上图的样子了。
    3.1.2 父亲结点为左孩子,插入结点为右孩子
    针对父节点进行左旋,此时左旋后的情况为3.1.4情况,然后按照3.1.4进行操作。
    在这里插入图片描述
    在这里插入图片描述
    插入52后,以父节点48左旋,左旋后,52和59互换颜色,再以59为结点右旋即可。

3.1.3 父亲结点为右孩子,插入结点也为右孩子
将父亲结点和爷爷结点的颜色互换,然后针对爷爷结点进行一次左旋
在这里插入图片描述
在这里插入图片描述
插入82后,59和79互换颜色,然后再进行左旋即可。
3.1.4 父亲结点为左孩子,插入结点也为左孩子
将父亲结点和爷爷结点的颜色互换,然后针对爷爷结点进行一次右旋
这种情况与3.1.1情况雷同。
在这里插入图片描述
在这里插入图片描述
插入50以后,48和59颜色互换,然后对59进行左旋即可。
3.2 叔叔节点为红色的情况
将叔叔和父亲结点改为黑色,爷爷结点改为红色,然后又将爷爷节点当做插入点做此操作。

在这里插入图片描述
在这里插入图片描述
插入85后,将父亲和叔叔结点变为黑色,将爷爷节点变红,但发现爷爷节点为根节点,所以满足性质2,将根节点变为黑色即可。

  • 删除
    删除同样在删除操作后要进行一些列变化使树仍然具有红黑树的性质。
    删除情况有三种:
    1.删除结点没有儿子的情况:

1)删除结点为红色
直接删除,不影响红黑树性质
2)删除结点为黑色,其兄弟结点没有儿子
将兄弟节点变成红色,将父亲节点变成黑色,保持性质5。
如图,删除96这个节点:
在这里插入图片描述
删除后
在这里插入图片描述
3)删除结点为黑色,其兄弟结点有一个孩子不空,并且该孩子为右孩子和其父亲节点在同一边。
首先删除,当前节点83,然后把兄弟节点和父亲节点交换,在把父亲节点变黑,然后,把兄弟节点子节点变黑:
1.如果兄弟结点和兄弟结点的儿子都在右子树的话:对父亲结点进行左旋
2.如果兄弟结点和兄弟结点的儿子都在左子树的话:对父亲结点进行右旋
如图列出为第二种情况:
在这里插入图片描述
删除后
在这里插入图片描述
4)删除结点为黑色,其兄弟结点有一个孩子不空,并且该孩子为左孩子
限于篇幅和时间问题,后面的各种情况就不一一作图说明了。
如果要想自己尝试,或者看这个过程请看 红黑树演示地址

5)删除结点为黑色,其兄弟结点有两个孩子,而且兄弟结点为红色
6)删除结点为黑色,其兄弟结点有两个孩子,而且兄弟结点为黑色
二.删除结点只有一个儿子的情况:
1)删除结点为黑色,其唯一的儿子结点为红色(必定是红色,要不然不符合红黑树的第5条性质)
2)删除结点为红色,其儿子结点只能为黑:红黑树中不存在这种情况,要不然无法满足红黑树第5条性质
三.删除结点有两个儿子的情况;
以上就是删除的三种情况。

总结

红黑树的情况比较复杂,但是不难理解,首先要理解平衡二叉树,对左右旋转要理解,熟悉红黑树的五个性质,不管是删除添加都要保持这5个性质同时其又是一个特殊的平衡二叉树。


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

相关文章

红黑树原理剖析

首先介绍一下红黑树的几点性质: 性质1:根节点是黑色 性质2:每个叶子节点是黑色(指的是空叶子节点) 性质3:每个红色节点的两个子节点一定是黑色 (子节点必须同时存在或不存在) 性质4:任意一节点到每个叶子节点的路径都包含数量相同的黑节点(非空叶子…

红黑树原理及插入

文章目录 1、前言2、红黑树2.1、性质2.2、操作2.2.1、变色2.2.2、左旋2.2.3、右旋2.2.4、查找2.2.5、插入 2.3、插入情景2.3.1、红黑树为空树2.3.2、插入结点的Key已存在2.3.3、插入结点的父结点为黑结点2.3.4、插入节点的父节点为红色2.3.4.1、叔叔结点存在并且为红结点 2.3.5…

红黑树原理及代码实现(一)

红黑树简介 红黑树是一种自平衡的二叉查找树,它的统计性能要优于平衡二叉树,因此在很多地方都有应用,例如Java中的TreeMap,HashMap等数据结构都使用到了红黑树。红黑树对很多人来说熟悉而陌生,熟悉则是因为知道红黑树…

图解红黑树原理

一.红黑树的性质(一种自平衡的二叉查找树) 1. 根节点是黑色。 2. 节点是红色或黑色 3. 叶子节点都是黑色的空节点(NIL节点) 意思就是末尾一排是黑色空节点(可全部省略) (叶子节点意思是没有子…

红黑树原理和算法详细介绍

目录 1 R-B Tree简介 2 红黑树的时间复杂度和相关证明 3 红黑树的基本操作 1. 左旋 2. 右旋 3. 添加 4.1 删除 1 R-B Tree简介 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储…

HashMap底层红黑树原理(超详细图解)+手写红黑树代码

在看完了小刘老师和黑马的源码视频之后,我整理了一篇HashMap的底层源码文章,学海无涯,这几天看了对红黑树的讲解,故将其整理出来 HashMap底层源码解析上 HashMap底层源码解析下 视频链接 小刘老师讲源码 传智播客-黑马程序员 文章目录 树结…

红黑树原理及java实现

红黑树 红黑树规则特点: 节点分为红色或者黑色;根节点必为黑色;叶子节点都为黑色,且为null;连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);从任意节点出发&…

红黑树原理及旋转

红黑树,本质上来说就是一棵二叉查找树 但它在二叉查找树的基础上增加了着色和相关的性质使得红黑树相对平衡 保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n) 但它是如何保证一棵n个结点的红黑树的高度始终保持在h logn的呢?这就引出了红黑…

HashMap红黑树原理分析

近期学习了 HashMap 实现原理,这篇咱们了解一下红黑树的设计,相比 jdk1.7 的 HashMap 而言,jdk1.8最重要的就是引入了红黑树的设计,当hash表的单一链表长度超过 8 个的时候,链表结构就会转为红黑树结构。 01、故事的起…

HashMap源码学习:红黑树原理详解

文章导航 HashMap源码学习:红黑树原理详解 HashMap源码学习:JDK1.8版本源码解析 目录 文章导航前言概述红黑树的特性变色平衡右旋平衡左旋平衡 正文红黑树平衡方法:balanceInsertion红黑树左旋方法:rotateLeft红黑树右旋方法&…

红黑树原理讲解

红黑树原理讲解 一、红黑树的性质二、红黑树的3种变化策略?(为满足红黑树性质)1. 改变颜色2. 左旋3. 右旋 三、红黑树的插入情景1:红黑树为空树情景2:插入节点的key已经存在情景3:插入节点的父节点为黑色情…

红黑树原理详解

红黑树原理详解 红黑树的旋转红黑树上结点的插入红黑树上结点的删除 参考: 教你初步了解红黑树 红黑树(一)之 原理和算法详细介绍 红黑树定义: (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 在该文件夹目录下…