算法 : 这可能是你看过最简洁的红黑树笔记

2023年 9月 6日 100.8k 0

👈👈👈 欢迎点赞收藏关注哟

首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…

一. 前言

之前其实已经学过几次红黑树了,但是过了一段时间就忘了。

所以这一篇来把这一块好好理一下,目的是能快速回忆起知识点,希望能达到这个目的。

👉👉👉🎈好东西当然要分享 :一个非常好的红黑树演变网站,用了就不想回来看我的了👈👈👈

这么好的网站应该配得上一个收藏吧!!

二. 红黑树的目的

红黑树的最大目的就是 : 确保操作的时间复杂度能稳定在对数级别。

其作用主要有以下几点 :

  • 保持树的平衡 :如果树一直在单边插入,则树会变得不平衡,去查找单边的信息时,会深入很多层,红黑树保证层数不会失衡
  • 提高查询的效率 :如果单边插入,则查询的时间复杂度会从对数级别变成线性级别。红黑树的目的是让查询一直在对数级别

补充知识点 : 对数级别和线性级别

image.png

三. 红黑树的特性

五大规则

  • 节点只有2种颜色 :红色和黑色
  • 根节点是黑色的
  • 叶子节点是黑色的 (包括 NIL 节点和空节点)
  • 不能有两个相连的红色节点(红色节点的子节点都是黑色的)
  • 从任意节点到其每个叶子的路径都包含相同数量的黑色节点

目的解析

来依次解析上面的关键要点 :

  • 问题一 : 为什么根节点一定是黑色 ?
    • 根节点黑色主要是为了配合规则 5 , 如果根节点是红色,则每个子树都得有一个红色节点或者都没有红色节点
    • 规则 3 同理 ,为了保证每个路径上会有相同的黑色高度
  • 问题二 : 左右子节点有大小关系吗?
    • 每个节点的 左子节点 的值必定 小于 节点本身的值
    • 每个节点的 右子节点 的值必定 大于 节点本身的值
  • 问题三 : 为什么不能有相连的红色节点
    • 如果没有规则4 (相连红色节点)。则红色节点可能会形成红色链表(一条长红色单链,其他树都没红色节点)
  • 问题四 : 规则 5 能带来哪些好处 ?
    • 有限高度 : 规则 5 保证了根节点到任意叶子节点的路径是相等的

为了达成目的的演变

如果我们一直往右侧不停的递增,那么由于排序要求,右侧树会越来越长,那么自然就会导致平衡的变化,这个时候就会发生左旋和右旋

着重来聊一聊为什么规则5能保证有限高度,首先来看一看极端情况 :

image.png

  • S1 : 当我们插入 313 这个数据的时候,按照规约 , 会挂在 312 的右边
  • S2 : 为了保证每条路径需要有相同的黑色节点,就必然需要以红色节点的身份插入
  • S3 : 但是由于红色节点不能连续 ,则需要解析变换,变换得到方式就是通过旋转

最终就会形成下面的结构 :

image.png

四. 红黑树的演变方式

演变过程开源在这个网站上面找到,这里演示几种常见的用法 :

4.1 初级版 : 3位元素带来的基本变化

image.png

这里我隐藏了null节点,如果包含null节点,应该是这样的图形 :

image.png

3个元素的红黑树,最终的效果就是如上图所示,是满足上面的5大规则得到。

同时从遍历的效率上来看,之前遍历到003需要走两步,现在左右都只需要一步就可以完成,达到平衡的要求

4.2 变化 : 均匀插入新的节点

现在基于这3个位点,衍生出了四种插入方式 :

image.png

由于要保证节点的有序性,所以当均匀的插入一个数据后,节点会自然的按照排序规则自然的排序到指定的位置。

4.3 旋转 : 当部分分支插入大量的节点

触发选择的条件是红黑树变得不平衡时 ,例如我们一直插入最大的数 :

image.png

我们可以把树形结构想象成一个手链,每个节点都有一定的重量,为了平衡我们会拿着手链的中间,让手链平衡。

  • 当手环右边一直变重,为了更平衡,我就需要往右边多拿点,所以我手持的节点就会变成当前节点的右节点
  • 而原本手持的节点就会变成最新节点的左节点

而这样就形成了一个旋转的效果,用一个口诀来解释 :

  • 左旋 : 自己变成右孩子的左孩子,整体结构向左旋转一格
  • 右旋 : 自己变为左孩子的右孩子,整体结构向右旋转一格

左旋

左旋.gif

右旋

右旋.gif

一直右旋

如果一直往一个方向去添加数据,则会触发更大范围的右旋 :

一直右旋.gif

五. 扩展知识点

5.1 HashMap 的树形转换

为了解决 Hash 冲突 ,HashMap 在其中引入了红黑树的概念。

Hash 冲突时的数据初始会形成一个链表,当达到一定的阈值后 ,会被转换为红黑树,从而保证查询的下效率。

优势 : 把一个长链表的查询转为树查询, 又通过红黑树的特点保证了查询的效率和复杂度均衡。

5.2 红黑树和 B+ 树的区别

// 结构
- 红黑树是二叉搜索树,只有2个节点,且有大小顺序
- B+树是多路搜索树,有 n 个节点,同样可以有大小顺序 

// 存储方式 :
- 红黑树通常每个节点都会存储全量数据,所有的键值对(因为每一个都是一个Node)
- B+树例如 MySQL 的结构,节点只会存储关键字,叶子节点才会存储全量数据


// 层级 :
- 红黑树由于二叉结构,层级会更高,但是每一路的复杂度相同
- B+树每一层有多个节点,使结构变得更加扁平,基于关键字范围,降低了高度提高了查询的效率

总结

好好学习天天向上 ,写的不易且行且珍惜。

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论