红黑树底层原理【白话版】

news2024/11/24 2:32:32

一、红黑树——特殊的平衡二叉搜索树

定义:红黑树是一种特殊的平衡二叉搜索树。我们用它来排列数据,并方便以后快速检索数据。

估计看到这句话,你就崩溃了,因为这话说了等于没说。

先观察这个图。

  • 球要不是黑色,要不是红色,没有其他颜色,对吧?这是红黑的来源。
  • 最上面的数字50是黑色的。(这个应该没有什么问题吧?)我们称它为根节点。
  • 所谓的2叉,就是一个球球最多只分出去2个节点。(这个应该没有什么问题吧?)
  • 10 比 50小,放在50的左边。78比50大,放在50的右边。下面的以此类推(这个应该没有什么问题吧?)

而红黑树最重要的规则,也就是它的平衡性,则体现在:

  1. 每个节点都有一个颜色属性,可以是红色或黑色。
  2. 根节点以及所有叶子节点(NIL 节点)都被视为是黑色的。
  3. 如果一个节点是红色的,则其子节点必定为黑色。
  4. 从根节点到每个叶子节点的路径上包含相同数量的黑色节点(黑色高度相等)。

叶子节点:没有分叉子节点的节点。

NIL节点:没有数据的空节点。

在红黑树里,它们其实指的是同一个节点。比如,我们先来看一张图:

 如果你和我一样,90 没有分叉子节点,它不是叶子节点吗,如果是,为啥是红颜色的呢?

而当我们,把这个按钮打开,你就会发现,这个红黑树的真实样貌:

 

是不是茅塞顿开,NIL节点像占位符一样,确保每个节点都有2个子节点,以达到平衡的状态。

二、普通的平衡二叉搜索树

为什么说红黑树是一种特殊的平衡二叉搜索树?

这是一棵普通的平衡二叉树。

只要从根节点到叶节点路径差小于等于1就可以了。

这里的“路径”指的是从根节点到最下面的叶节点箭头数量,你可以数数看。

而红黑树对这一段数据的处理是这样的:

 首先可以看到颜色和我们的红黑树就不一样,其次平衡规则不太一样。

这里不再是数路径,而是数从根节点到叶节点的黑色节点的数量。而且必须相等。

三、不平衡的二叉搜索树 

那么你可能会有疑问,难道有不平衡的二叉树?

没错。如果你按照朴素的规则,小的放左边,大的放右边,很可能出现,左边没有,右边很多的画面。

这棵树已经过于倾斜,甚至出现链表状结构了,会导致操作的时间复杂度退化为O(n),此时如果你要检索一个数据,花的时间就太多了。

你可以把它理解为抽屉,抽屉里包含抽屉。每开抽屉,都要用锁(模拟查询消耗的时间 )。如果不平衡,那么花很长时间找东西。比如,我想找7,我要翻箱倒柜,一路开抽屉。

而如果排列有序(平衡的),那么不管找哪个抽屉里的东西,所花的平均时间是最少的。比如这种平衡二叉树。两边的路径长度差小于等于1。你往里插入数据,它会实时调整,保持一种平衡的状态,提高检索效率。

这里有个图形化网站可以帮助你理解这种平衡二叉树。可以自己手动插入数据,感受平衡二叉树的动态平衡。

Data Structure Visualization

最后,既然我们知道了红黑树的原理,那么我们用红黑树来干嘛呢?

没错,用来查找、插入和删除。提高检索和排序效率。

Set的实现类之一TreeSet底层用的就是红黑树原理。这也是它较之HashSet、HashLinkedSet 有序的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

console的奇妙用法

console的奇妙用法 console.log是调试 JavaScript 代码的最佳方法之一。但是本文将介绍几个与console交互的更好方法。 在vscode或者的其他ide中输入console可以看到里边提供了非常多的方法。 虽然我们通常都是用console.log,但是使用其他可以使调试过程变得更加容…

分布式链路追踪

文章目录 1、背景2、微服务架构下的问题3、链路追踪4、核心概念5、技术选型对比6、zipkin 1、背景 随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构…

流水灯——FPGA

文章目录 前言一、流水灯介绍二、系统设计1.模块框图2.RTL视图 三、源码四、效果五、总结六、参考资料 前言 环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 每隔0.2s循环亮起LED灯 一、流水灯介绍 从LED0开始亮起到LED3又回…

如何定制自己的应用层协议?|面向字节流|字节流如何解决黏包问题?如何将字节流分成数据报?

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

基于ssm的社区生活超市的设计与实现

博主介绍:专注于Java技术领域和毕业项目实战。专注于计算机毕设开发、定制、文档编写指导等,对软件开发具有浓厚的兴趣,工作之余喜欢钻研技术,关注IT技术的发展趋势,感谢大家的关注与支持。 技术交流和部署相关看文章…

SpringBoot拦截器

一、SpringBoot拦截器介绍 Spring Boot中的拦截器是一种用于在处理请求之前或之后执行特定操作的组件。拦截器通常用于实现对请求进行预处理、日志记录、权限验证等功能。 在Spring Boot中,可以使用HandlerInterceptor接口来定义自己的拦截器,并通过配…

流水灯实现

文章目录 一、流水灯二、代码实现三、引脚分配 一、流水灯 流水灯指的是LED像水流一样点亮,即LED依次点亮但不立刻熄灭,等到4个LED都点亮后,再把所有灯一次性熄灭。 二、代码实现 module horse_led(input wire clk,input wire rst_n,output…

记录管理系统

简单的记录管理系统,适用于保存表格数据,可以用来替代Excel软件保存数据,提供可视化拖动组件用于自定义数据列,数据存到数据库,相比于Excel,更易保存,易搜索。 例如创建合同记录数据&#xff0…

【电子学会】2023年05月图形化四级 -- 计算圆的面积和周长

计算圆的面积和周长 编写程序计算圆的面积和周长。输入圆的半径,程序计算出圆的面积和周长,圆的面积等于3.14*半径*半径;圆的周长等于2*3.14*半径。 1. 准备工作 (1)保留舞台中的小猫角色和白色背景; 2…

MySQL数据表高级操作

一、克隆/复制数据表二、清空表,删除表内的所有数据删除小结 三、创建临时表四、MySQL中6种常见的约束1、外键的定义2、创建外键约束作用3、创建主表test44、创建从表test55、为主表test4添加一个主键约束。主键名建议以"PK_”开头。6、为从表test5表添加外键&…

Html利用Canvas绘制图形

今天接到粉丝私信,询问是否可以通过Canvas绘制一些图形,然后根据粉丝提供的模板图,通过Canvas进行模拟绘制,通过分析发现,图形虽然相对简单,但是如果不借助相应的软件,纯代码绘制还是稍微费些时…

机器学习:self supervised learning- Recent Advances in pre-trained language models

背景 Autoregressive Langeuage Models 不完整的句子,预测剩下的空的词语 sentence completion Transformer-based ALMs Masked language models-MLMs 预训练模型能将输入文本转成hidden feature representation 模型参数最开始是从预训练模型中拿到&#xf…

如何快速制作一个奶茶店小程序商城

如果你是一个奶茶店的老板,你可能会考虑开设一个小程序商城来增加销售渠道和提升品牌形象。那么,如何快速制作一个奶茶店小程序商城呢?下面我们将介绍一个简单的步骤供你参考。 首先,你需要登录乔拓云平台进入商城后台管理页面。在…

数据结构真题

数据结构真题 1. A. Bills of Paradise 线段树并查集四个操作: D x。标记大于等于 x 的第一个未标记的 a i a_i ai​;若没有,则不操作.F x。查询大于等于 x 的第一个未标记的 a i a_i ai​;若没有,则输出 1 0 12…

《UNUX环境高级编程》(9)进程关系

1、前言 2、终端登录 在早期的UNIX系统,用户用哑终端(用硬连接到主机)进行登录,因为连接到主机上的终端设备数是固定的,所以同时登录数也就有了已知的上限。 随着位映射图像终端的出现,开发出了窗口系统&…

数学分析:对偶映射

这个其实就是我们一致讨论的对偶映射,换了个马甲,差点认不出来了。本来是V->R 要变成U->R,就需要一个反向的V*->U*的映射。 注意这个式子,t属于U,phit转到了V,但是坐标也发生了变化,这…

2023西南赛区ciscn -- do you like read

Attack 打开后一个商城页面 在login as admin那里有个登录页面,账号admin,密码爆破即可得到admin123 也可以在book.php?bookisbn1进行sql注入得到密码,这里发现是没有注入waf的 登录进来是一个Book List的管理页面,同时在审计源…

【C语言】初阶指针(详细版)

👦个人主页:Weraphael ✍🏻作者简介:目前正在回炉重造C语言(2023暑假) ✈️专栏:【C语言航路】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你…

RSA原理

RSA的历史 RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)在1977年一…

本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT

OpenAI公司基于GPT模型的ChatGPT风光无两,眼看它起朱楼,眼看它宴宾客,FaceBook终于坐不住了,发布了同样基于LLM的人工智能大语言模型LLaMA,号称包含70亿、130亿、330亿和650亿这4种参数规模的模型,参数是指…