理解红黑树及代码实现

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

1.红黑树定义
红黑树是一颗 红-黑的平衡二叉树,它具有二叉树的所有特性,是一颗自平衡的排序二叉树.(树中任何节点值都大于左子节点的值,而且都小于右子节点的值),其检索效率高,它是一颗空树或它的左右两个子树高度差的绝对值不超过1,并且左右子树都是平衡二叉树.
在这里插入图片描述
最坏的情况下 是一边倒的情况
在这里插入图片描述
在这种情况下,如果我们要在树中查找g节点,就需要顺着根节点往下找,时间复杂度约为O(n)常数级。那么红黑树具有以下特点,使得它的查找时间复杂度为O(lg n)
在这里插入图片描述
性质
1.每一个节点 必须为红色或者黑色
2.根节点是黑色的
3.每个叶子节点(nil节点 空节点是黑色的)
4.如果一个节点是红色的,那么它的叶子节点都是黑色的(同一个路径下 不允许出现两个相邻的红色节点)
5.对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点(黑节点的数目称为黑高black-height)
从根到叶子节点的最大路径不能大于最短路径的两倍长,大致上是平衡的,插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例。
如果查找、插入、删除频率差不多,那么选择红黑树。
插入

口诀:所有插入为红色,父红叔红变颜色 ,父红叔黑右子树 以父为心向左旋 ,父红叔黑左子树 变父为黑爷为红 以爷为心向右旋

默认插入的节点为红色,因为黑色节点的数量为红色节点数量的两倍多,因此插入节点的父节点为黑色的概率很大,不需要做任何调整,效率较高.
1.父为黑
在这里插入图片描述
这种情况下,直接插入,且插入后无需任何操作,黑色节点的数量多与红色节点的数量(2倍左右),因此父为黑这种概率比较大,效率比AVL树高。
2.父为红
这种情况破坏了红黑树的特点(相同路径下不能出现两个相邻的红色节点),因此,因此要跟据叔叔的颜色 做不同的插入处理
在这里插入图片描述
图中叔叔的颜色也有两种可能 暂时以蓝色表示
1),叔叔为红
在这里插入图片描述
2),叔叔为黑(这种情况有比较复杂)
a.父在左,叔叔在右,新节点在左
在这里插入图片描述
b,父在左 叔叔在右,新在右
在这里插入图片描述
c,父在右,叔在左 ,新在右
在这里插入图片描述
d,父在右,叔叔在左,新在左
在这里插入图片描述
删除
删除一颗普通的二叉排序树 有三种情况
1.叶子节点
2.只有左子树或只有右子树的节点
3.既有左子树 又有右子树的节点
对于情况3来讲,我们的思路是先找到待删除节点的后继节点(左孩子节点或右孩子节点),然后用孩子节点的值将待删除节点的值覆盖,最后按1,2中的方法删除孩子节点即可
对情况2来讲,待删除节点只有左子树或右子数,有很多组合,在红黑树中是不存在的,违背了红黑树的性质,图中 C代表待删节点,CR表示右孩子,CL表示左孩子
在这里插入图片描述
图中这四种情况都违背了红黑树性质5,不会存在
在这里插入图片描述
此图中 违背了性质4
1,待删除的节点为红色
C 代表要删除的节点,P代表父节点
在这里插入图片描述
上面这两种情况 处理方式都一样,直接删除C就好
另外待删除的红色节点,只有左子树或右子树 这种情况是不存在的(已探讨)
2,接下来,讨论最复杂的情况,待删除的节点为黑色节点
a,删除黑色的叶子节点
在这里插入图片描述
这种情况相对复杂,后面细分
删除的黑色节点 仅有左子树或仅有右子树
在这里插入图片描述
对于这种情况,我们用子节点覆盖调节点C,并且将C 的子节点的颜色改为黑色 ,(因此路径上少了一个黑节点,所以将红色节点变为黑色节点以保证红黑树的性质)
a.1:待删除的叶子节点兄弟节点为红色
在这里插入图片描述
c为父节点的左子节点的情况,做法是将兄弟节点b和父节点p的颜色互换,同时将兄弟节点p左旋转
在这里插入图片描述
此时C的兄弟节点变成了黑色 这就是我们后面要讨论的情况

c是右子节点的情况,同上,将兄弟节点b和父节点p的颜色互换,同时将兄弟节点p右旋转
在这里插入图片描述

在这里插入图片描述
此时c的兄弟节点也变成了黑色 ,这也是我们后面要谈论的情况
a.2:兄弟节点为黑色,且远侄子节点为红色
c为左孩子的情况,这时c的远侄子节点为b的右孩子
在这里插入图片描述
没有上色的节点表示为红黑均可,如果bL为黑色,则bL则必为null节点,如果删除c,那么经过c节点的黑节点个数就少一个,但如果我们能把bR节点移到左侧,并改为黑色,就满足红黑树的特点了,(p节点的颜色不影响,因为整个调整过程是在p子树内部进行的)
调整过程为将b和p颜色对调,将b进行左旋转(L操作),同时将远侄子节点bR变为黑色,删除掉c
在这里插入图片描述
c为右孩子的情况,此时c的远侄子为b的左孩子
在这里插入图片描述
同样,将b节点和p节点颜色对调,然后将以b节点为起始,向右旋转,将c的远侄子节点bL变成黑色 删除掉c
在这里插入图片描述

a.3:兄弟节点为黑色,远侄子节点为黑色,近侄子节点为红色.
c为左孩子,近侄子节点为兄弟节点的左孩子在这里插入图片描述
此时将bL节点右旋(R操作),将b节点和bL节点颜色对调
在这里插入图片描述
这时候就变成了a.4的情况
c为右孩子,近侄子节点为兄弟节点的右孩子 且为红节点
在这里插入图片描述
做法是将bL节点左旋(L操作),将b节点和bL节点颜色对调
在这里插入图片描述
这样就变成了a.4

a.4:父亲节点为红色,且兄弟节点和兄弟节点的两个孩子节点(只能是null节点)都为黑色 的情况
在这里插入图片描述
如果删除节点c,那么经过p和c的节点的黑节点就少了一个,这个时候我们可以把p变为黑色,这个时候 删除c节点经过c的子节点(空节点)的路径上的黑节点就和原来一样了,但是经过b节点的路径上就多了一个黑节点,所以我们可以把b变成红节点,这样经过b的路径上的黑色节点就和原来一样了

做法是 将父节点p变成黑色,将b节点变成红色
在这里插入图片描述

a.5:父亲节点,兄弟节点 以及兄弟节点的孩子(只能是null节点)都为黑色的情况
在这里插入图片描述
方法是将b节点改为红色,这样删除c以后p的左右子树上的黑节点的个数就相同了,但是这样 经过b节点的路径上的黑节点就少了一个,这个时候,我们再以p为起始点,继续根据情况进行平衡操作(这句话的意思就是把p当成c(只是不要再删除p了),再看是那种情况,再进行对应的调整,这样一直向上,直到新的起始点为根节点)
网页工具:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
在这里插入图片描述
在这里插入图片描述
判断类型的时候,先看待删除的节点的颜色,再看兄弟节点的颜色,再看侄子节点的颜色(侄子节点先看远侄子再看近侄子),最后看父亲节点的颜色
开始写代码了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

相关文章

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

———————————— 二叉查找树(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.数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考…

清理mysql慢查询日志_MySQL清理慢查询日志slow_log的方法

一、清除原因 因为之前打开了慢查询,导致此表越来越大达到47G,导致磁盘快被占满,使用xtrabackup进行备份的时候文件也超大。 mysql> show variables like log_output%; Connection id: 1694401091 Current database: mysql +---------------+-------+ | Variable_name | …

mysql 慢查询日志的设置与优化

目录 1 引言 2 慢查询日志配置 3 分析工具 1 引言 MySQL数据中有记录慢查询的一种手段。并且是MySQL自带的。可用来排查那些查询sql语句执行得慢。从而给开发者提供一个调优得依据。 MySQL 慢查询的相关参数解释: slow_query_log :是否开启慢查…

如何开启mysql慢查询日志?

1、查看mysql的慢查询日志是否开启 show variables like %query%; 可以看到slow_query_log的值是OFF,也就是mysql默认是不启用慢查询日志的。 这里还有个long_query_time,默认是10秒,也就是超过了10秒即为慢查询。 log_queries_not_using_…

MySQL慢查询日志详解

本次代码执行环境的mysql版本是 :5.6.37-log 1.慢查询日志概念(也叫慢日志):在 MySQL 中执行时间超过指定时间的 SQL 语句 2.常见的几个相关的变量 (可以直接去mysql下的配置文件my.cnf文件中去改,我下面是直接在SQLyog中进行操作) 默认情况下慢查询日志是关闭的…