数据结构:什么是红黑树?为什么要用红黑树?

article/2025/5/15 9:35:56

本篇主要谈谈对红黑树的理解,大家都晓得JDK8中的hashmap底层是数组+链表+红黑树实现的,当面试官问你:为啥要加上红黑树实现呢??
那我们首先从概念来了解一下:

一、什么是红黑树?

红黑树是一个接近平衡的二叉查找树,也就是说二叉查找树的特性红黑树应该都具备,那么具备哪些特性呢?

  • 左子树小于根节点
  • 右子树大于根节点
  • 左右子树也分别为二叉查找树

换句话就是有序的。那么有什么优点呢?
在这里插入图片描述
比如我要插入2,该怎么插入呢?
和5比较,<5,到左侧;和3比较,<3到左侧;和1比较,>1,到1的右侧;
比如查询1呢?该如何查询?其实一思考,查询的过程和插入的过程是一样的,其实也就是二分查找的思想。所查询的次数也就是树的高度。其时间复杂度为logn.
那问题来了,什么是红黑树呢?我们如上举例是一个平衡的二叉树,因为根节点是5。但是当有一个诸如这样的序列:1,4,5,7,8,9那么这个二叉树会变成什么样?
在这里插入图片描述
那么时间复杂度就变成了O(N),当数据量足够大的情况下,那速度就可想而知。
所以我们便衍生出了红黑树,一个自平衡的二叉树,除了具备二叉树的特性,还具备以下特性:

  • 每个结点不是红色就是黑色
  • 不可能有两个红色结点相连,每个叶子都是空的黑结点(null),不存储数据
  • 根节点都是黑色root
  • 每个结点,从该结点到其可达叶子结点的所有路径,都包含相同数目的黑色结点

在这里插入图片描述
当插入或者删除的时候,红黑树的规则可能就会被打破,那么就得做出一些调整,去维持这些规则。

二、基本操作

1、变色(黑变红,红变黑)

要求:

  • 父节点是红色;
  • 叔父节点也是红色;

变更:

  • 将父节点和叔父节点变为黑色;
  • 爷爷节点变为红色;
  • 把指针指向爷爷节点,变为下一步要操作的结点;

在这里插入图片描述
6是想要插入的数值,发现父和叔节点都是红色,则采用变色处理:
在这里插入图片描述

2、左旋

要求:

  • 当前父节点是红色;
  • 叔父节点是黑色;
  • 当前的结点是右子树;
  • 指针变化到父节点(未旋转之前的父节点)

在这里插入图片描述
上一步已经把指针指向了爷爷节点,我们发现12这个爷爷节点符合左旋的规则,所以进行左旋。
12的父结点变为自己的左结点,自己的左结点给了父节点作为他的右结点。如下图:
在这里插入图片描述

3、右旋

要求

  • 当前父节点是红色;
  • 叔父节点是黑色;
  • 当前的结点是左子树;
  • 以爷爷节点右旋;

变更

  • 父节点变为黑色;
  • 爷爷变为红色;

如上例子还未到平衡二叉树,左旋完成之后,将结点指向了操作结点5。5的父节点是红色,叔父节点是黑色,且5是左子树,满足右旋,将爷爷节点变为红色,父节点变为红色,移动位置,如下图:
在这里插入图片描述

如上则完成了红黑树的要求。整个变更流程如下图,
在这里插入图片描述
分析下来,通过插入一个节点对于红黑树的基本操作有了一个基本的了解。所以其时间复杂度都是接近于logn。

三、为何要用红黑树?

最熟悉的用红黑树的地方就是jdk8对应的hashmap,红黑树其实也是采用的二分法,相比于二叉查找树,可以避免单一链表,腿脚部分的特殊情况的出现。最坏的情况,时间复杂度也就是接近logn。同样的道理,这也是为何不用数组+链表,而又加入了红黑树的原因,也是为了避免链表过长,降低了效率。那为何不直接用红黑树呢?还得加上链表?因为红黑树需要进行左旋,右旋操作, 而单链表不需要。


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

相关文章

随处可见的红黑树详解

随处可见的红黑树详解 前言为什么要有红黑树二叉搜索树平衡二叉搜索树红黑树 红黑树的应用场景红黑树的性质&#xff08;重点&#xff09;红黑树的定义红黑树的左旋与右旋红黑树插入结点与插入维护红黑树的三种情况插入结点插入结点后维护红黑树父结点是爷结点是左子树1. 叔结点…

HashMap-链表与红黑树转换触发条件

JDK1.8对HashMap进行了很多优化。 例如当一个槽位slot上的链表个数过多时&#xff0c;则会将链表转换为红黑树&#xff0c;以提高查询检索的效率。 访问节点方式&#xff1a;先找到节点所在的数组index索引位置&#xff0c;然后判断节点是什么结构进行遍历。 节点结构是非树…

9.HashMap里的红黑树是什么

1. 简介 红黑树是一种自平衡二叉查找树。它的统计性能要好于平衡二叉树&#xff08;AVL树&#xff09;&#xff0c;因此&#xff0c;红黑树在很多地方都有应用。在C STL中&#xff0c;很多部分(目前包括set, multiset, map,multimap)应用了红黑树的变体(SGI STL中的红黑树有一…

算法:什么是红黑树

红黑树的定义 红黑树的英文是“Red-Black Tree”&#xff0c;简称 R-B Tree。它是一种不严格的平衡二叉查找树。顾名思义&#xff0c;红黑树中的节点&#xff0c;一类被标记为黑色&#xff0c;一类被标记为红色。除此之外&#xff0c;一棵红黑树还需要满足这样几个要求&#x…

pygraphviz的安装与红黑树可视化

大家好&#xff0c;我是小小明&#xff0c;今天我将带大家安装pygraphviz&#xff0c;并通过它对红黑树这种数据结构进行可视化。 pygraphviz的安装与红黑树的可视化 安装graphviz 下载地址&#xff1a;http://www.graphviz.org/download/ windows平台下可以选择&#xff1…

到底什么是红黑树?

到底什么是红黑树&#xff1f; 首先&#xff0c;可以这么简单粗暴的理解&#xff0c;红黑树≈平衡的二叉排序树。 那么很显然&#xff0c;要想弄懂红黑树&#xff0c;得先明白什么是树、二叉树、二叉排序树、平衡树以及不平衡树。下面我们一个个来了解。 1.第一个问题&#x…

面试常问:什么是红黑树?

什么是红黑树&#xff1f; ———————————— 二叉查找树&#xff08;BST&#xff09;具备什么特性呢&#xff1f; 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图…

红黑树简介

一、什么是红黑树 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉查找树&#xff0c;是在计算机科学中用到的一种数据结构&#xff0c;典型的用途是实现关联数组。 红黑树是在1972年由Rudolf Bayer发明的&#xff0c;当时被称为平衡二叉B树&#xff08;symme…

什么是红黑树?

一、红黑树的产生 1.二叉树 定义&#xff1a;二叉树&#xff08;binary tree&#xff09;是指树中节点的度不大于2的有序树&#xff0c;它是一种最简单且最重要的树。二叉树的递归定义为&#xff1a;二叉树是一棵空树&#xff0c;或者是一棵由一个根节点和两棵互不相交的&…

说说什么是红黑树?

分析&回答 红黑树介绍 R-B Tree&#xff0c;全称是Red-Black Tree&#xff0c;又称为“红黑树”&#xff0c;红黑树就是一种平衡的二叉查找树&#xff0c;说他平衡的意思是他不会变成“瘸子”&#xff0c;左腿特别长或者右腿特别长。除了符合二叉查找树的特性之外&#xf…

漫画:什么是红黑树?(整合版)

前段时间&#xff0c;小灰发布了红黑树相关的文章&#xff0c;分成上下篇来讲解。 这一次&#xff0c;小灰把两篇文章做了整合&#xff0c;并且修正了红黑树删除部分的图片错误&#xff0c;感谢大家的指正。 ————— 第二天 ————— ———————————— 二叉查找…

抗性基因数据库CARD介绍

随着抗生素药物的发现及使用&#xff0c;越来越多的耐药菌株由此产生。而耐药菌株的发展则会增加疾病治疗的难度和成本&#xff0c;因此耐药微生物的研究则显得尤为重要。目前&#xff0c;通过对耐药基因的鉴定挖掘能够一定程度上帮助我们揭开耐药机制&#xff0c;为疾病的治疗…

关于 GIL

目录 GIL是什么GIL产生的原因如何避免受到GIL的影响什么时候会释放GIL锁互斥锁和Gil锁的关系 参考链接 python中的GIL详解 python面试不得不知道的点——GIL 《Python面试每日一题》之GIL Python GIL 是功能和性能之间权衡后的产物&#xff0c;它尤其存在的合理性&#xff0…

gin介绍

Gin的介绍与应用 Gin是一个golang的web框架&#xff0c;Gin像是一些常用函数或者工具的集合。具有快速灵活&#xff0c;容错方便等特点。Gin自身的net/http足够简单&#xff0c;性能也非常不错。 Gin的官网&#xff1a;https://github.com/gin-gonic/gin 安装前保证git和go都安…

gin_gorm

一、使用形式 1、引入gorm包 import "github.com/jinzhu/gorm" 2、导入数据库驱动 import _ "github.com/go-sql-driver/mysql"为了方便记住导入路径&#xff0c;GORM包装了一些驱动&#xff1a; import _ "github.com/jinzhu/gorm/dialects/mysq…

【GIC】配置GIC

本章介绍如何在裸机环境中启用和配置兼容GICv3的中断控制器。 目录 一、全局设置 二、单独PE设置 2.1 Redistributor配置 2.2 CPU接口配置 2.3 PE配置 三、SPI, PPI, SGI配置 3.1设置SPI的目标PE 附&#xff1a;寄存器介绍 附1&#xff1a;GICD_CTLR 附2&#xff1a;…

大寰AG-95夹爪指尖更换、结构示意图及通讯协议转换器说明

注意&#xff1a; 在对手爪进行任何操作之前&#xff0c;请先关闭机器人和夹持电源。 大寰AG-95夹爪指尖更换更换步骤&#xff1a; 1. 使用 M3 内六角螺丝刀卸下指尖螺丝&#xff0c;拆卸磨损的指尖。 2. 清洁手指件并彻底擦干。 3. 取出指尖上φ3x6 mm 定位销。 4. 将…

使用Landsat系列数据来检测喜马拉雅地区的冰湖溃决(Georg Veha等人,RSE,2018)

一、背景 这是一篇做冰湖溃决的文章&#xff0c;作者主要使用了random forest来检测喜马拉雅地区的冰湖溃决现象&#xff0c;这项成果发表在了Remote Sensing of Environment上。 文献连接&#xff1a;https://doi.org/10.1016/j.rse.2017.12.025 文献引用&#xff1a;Georg Ve…

App设计灵感之十二组精美的智能家居App设计案例

通过手机远程启动家里的各种家用电器&#xff0c;让我们回到家后可以享受到舒适的环境&#xff0c;这便是智能家居给我们带来的便利。 ① Smart Hub Application design by Ariuka ② Smart Home by Srgi Mi ③ Smart Home Mobile App by Ghulam Rasool ④ Smart Home Mobile …