二叉树之红黑树

article/2025/10/1 4:03:43

红黑树

概述

为什么要有红黑树???

特点

红黑规则

如何在红黑树上添加节点?

(1)我们不妨假设加入的节点都是黑色

(2)如果我们加入的节点都是红色

红黑树添加节点后如何保持红黑规则

添加规则综述


红黑树

概述

红黑树是一种自平衡二叉查找树。是计算机科学中用到的一种数据结构。

1972年出现,当时被称之为平衡二叉B数。后来,1978年被修改为如今的红黑树

它是一种特殊的二叉查找树。红黑树的每一个节点上都有存储位表示节点的颜色。每一个节点可以是红色或者黑色

红黑树不是高度平衡的,它的平衡是通过红黑规则进行实现的。 

为什么要有红黑树???

在此之前,我们学习的是平衡二叉树,其高度平衡,左右子树不超过1。这样子可以使查找效率控制在 O(logn),但是这样子也照成了不变!每当出现了不平衡的情况都要进行“左旋”,“右旋”处理,有点过于繁琐,故红黑树中做出了改进,只遵循自己的红黑规则

特点

  • 平衡二叉B树

  • 每一个节点可以是红或者黑

  • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的

红黑规则

我们可以参照图片进行讲解

(1)每一个节点或是红色的,或者是黑色的。

(2)节点必须是黑色。

(3)如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的。

上述图中,结点1,6,11,15,22,27它们都没有子节点,所以它们的左右指针都是NIL(空),且NIL的颜色都必须是黑色的;

节点13是根节点,所以它没有父节点,它的父节点的地址为空,即标记为NIL。

(4)如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)。

(5)对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点

例如节点 8 来说,它到其所有后代叶节点的简单路径的黑色节点个数都是2。

8->1->NIL ,8->1->6->NIL ,8->11-NIL路径上的黑色节点都是2个。

如何在红黑树上添加节点?

添加节点的颜色可以是红色,也可以是黑色。

(1)我们不妨假设加入的节点都是黑色

序列为20 ,18 ,23;过程如下:

先是20,将其设为根节点

 再插入18,此时违背了红黑规则,(即违背了第5条红黑规则)

 所以我要将18改为红色即可

最后将23插入,同样这样子也违背了红黑规则,处理方法与上面类似 

 将23节点改为红色即可

故添加3个元素,一共需要调整2次。

(2)如果我们加入的节点都是红色

序列为20 ,18 ,23;过程如下:

一开始我们将红色的20节点插入,显然此时已经违背了红黑规则,(根节点必须为黑色)

所以需要将20改为黑色,结构如下:

再将18插入,此时满足红黑规则,不需要调整

最后插入23,也没有破坏红黑规则,故无需调整

 所以,如果添加的3个节点为红色,只需要调整1次即可!

所以添加元素的时候尽量选择红色,这样子效率高!!!

红黑树添加节点后如何保持红黑规则

之后我们在添加节点的时候,都默认是红色的节点,因为这样子效率高!

从左到右一次插入节点,构建红黑树。

先将20插入,由于其为第一个节点,即根节点,所以将其改为黑色。

        

然后依次插入18,23,由于满足红黑规则,所以不要做任何操作

插入22时,稍微有一点复杂!如下图所示:

 按照上述图片进行修改后,树状结构如下所示:

继续添加16节点

再者添加24,19两个节点都不用进行任何操作!最终结果如下图所示:

添加规则综述

  • 根节点位置

    • 直接变为黑色

  • 非根节点位置

    • 父节点为黑色

      • 不需要任何操作,默认红色即可

    • 父节点为红色

      • 叔叔节点为红色

        1. 将"父节点"设为黑色,将"叔叔节点"设为黑色

        2. 将"祖父节点"设为红色

        3. 如果"祖父节点"为根节点,则将根节点再次变成黑色

      • 叔叔节点为黑色(复杂!)

        1. 将"父节点"设为黑色

        2. 将"祖父节点"设为红色

        3. 以"祖父节点"为支点进行旋转

 这里分析一下当父节点是红色,叔叔节点为黑色时的具体操作,同样以上述例子:

此时要插入14节点

插入后结果如下

(1)先将父节点15,设置为黑色

(2)再将祖父节点16,设置为红色

(3)最后以祖父节点为支点进行旋转


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

相关文章

红黑二叉树

红黑树 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色。 根节点是黑色。 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有…

红黑树-Java实现

目录 一、定义 二、插入 三、删除 四、全部代码 五、颜色效果 一、定义 红黑树是特殊的平衡二叉树,具有以下特性: 1、根节点的颜色是黑色 2、节点颜色要么是黑色、要么是红色 3、如果一个节点的颜色是红色,则它的子节点必须是黑色&…

红黑二叉树原理分析

1.引言 HashMap的基本结构是数组,链表和红黑树。以数组为基本形态,数组中的元素先以链表形式储存,当链表的长 度超过8时(包含数组上的那个链表头)就会将链表转换为红黑树,以加快修改和查询效率。当然除了H…

理解红黑树及代码实现

1.红黑树定义 红黑树是一颗 红-黑的平衡二叉树,它具有二叉树的所有特性,是一颗自平衡的排序二叉树.(树中任何节点值都大于左子节点的值,而且都小于右子节点的值),其检索效率高,它是一颗空树或它的左右两个子树高度差的绝对值不超过1,并且左右…

红黑二叉树的漫画讲解(轻松理解红黑二叉树原理)

———————————— 二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树,就是…

Java的二叉树、红黑树、B+树

数组和链表是常用的数据结构,数组虽然查找快(有序数组可以通过二分法查找),但是插入和删除是比较慢的;而链表,插入和删除很快(只需要改变一些引用值),但是查找就很慢&…

二叉树与红黑树

二叉树的形成 二叉树是n(n>0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成 二叉树特点 由二叉树定义以及图示分析得出二叉树有以下特点&#xff1…

红黑树(C++实现)

文章目录 红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入红黑树的验证红黑树的查找红黑树的删除红黑树与AVL树的比较 红黑树的概念 红黑树是一种二叉搜索树,但在每个结点上增加了一个存储位用于表示结点的颜色,这个颜色可以是红色的,…

红黑二叉树详解及理论分析

发表于我的博客网站(prajna.top): http://prajna.top/doc/2/175 什么是红-黑二叉树? 红-黑二叉树首先是一颗二叉树,它具有二叉树的所有性质,是一种平衡二叉树。普通二叉树在生成过程中,容易出现不平衡的现象&#xff…

二叉树到红黑树

二叉树查找树 又叫二叉排序树。二叉查找树或者是一棵空树,或者是一棵具有如下性质的二叉树: 对于任何一个结点X若它的左子树非空,则左子树上所有结点的值均小于等于X的值;若它的右子树非空,则右子树上所有结点的值均大…

详解c++---红黑二叉树的原理和实现

目录标题 什么是红黑二叉树树红黑树的性质红黑树的效率分析红黑树的准备工作红黑树的insert函数节点的调整情况一情况二情况三 转换的实现打印函数find函数检查函数 什么是红黑二叉树树 avl树是通过控制平衡因子来控制二叉搜索树的平衡,当某个节点的平衡因子等于2或…

红黑树和二叉树有什么区别?

红黑树和二叉树有什么区别? 什么是二叉树?什么是红黑树? 二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大于 2 的节点,二叉树的数据结构如下图所示 这是一棵拥有 6 …

二叉树系列:红黑树

介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。除了…

红黑树结构原理的图文讲解(非代码)

1.引言 HashMap的基本结构是数组,链表和红黑树。以数组为基本形态,数组中的元素先以链表形式储存,当链表的长度超过8时(包含数组上的那个链表头)就会将链表转换为红黑树,以加快修改和查询效率。当然除了Ha…

二叉树与红黑树见解

目录 一、红黑树简介二、 红黑树的特性三、红黑数的应用四、红黑树的原理实现4.1 识别红黑树4.2 红黑树节点的旋转4.3 插入节点4.3.1分情况讨论:4.3.2 代码示例 4.4删除节点相关引用 一、红黑树简介 红黑树是一种自平衡的二叉查找树,是一种高效的查找树…

什么是红黑树(内存最优的二叉树)

一.红黑树定义 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。 它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1…

【二叉树进阶】红黑树(Red Black Tree) - 平衡二叉搜索树

文章目录 一、红黑树的概念二、红黑树的性质2.1 红黑树和AVL树效率对比 三、红黑树的结构(KV模型)四、红黑树的插入4.1 插入节点4.2 平衡化操作(难点)4.2.1 情况一4.2.2 情况二4.2.3 情况三 4.3 总结 五、红黑树的验证六、红黑树的…

MySQL 慢查询日志导入 Elasticsearch 可视化查询分析

当应用程序后台 SQL 查询慢的时候我们一般第一时间会查看数据库慢查询记录,但是慢查询记录是原始文本,直接查询搜索分析比较费时费力,虽然业界有针对 MySQL 慢查询分析的命令行工具(比如:pt-query-digest)&…

MySQL 慢查询日志如何查看及配置

简介 MySQL 慢查询日志是排查问题 SQL 语句,以及检查当前 MySQL 性能的一个重要功能。 查看是否开启慢查询功能: 说明: slow_query_log 慢查询开启状态 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的…

MySQL高级篇——聊聊MySQL的慢查询日志

文章目录: 1.数据库服务器的优化步骤 2.查看系统性能参数 3.定位执行慢的 SQL:慢查询日志 4.查看 SQL 执行成本:SHOW PROFILE 1.数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考…