红黑树阅读

关于红黑树

其实之前看算法的红宝书就有些印象,红黑树是2-3-4树
介绍一篇在知乎上的文章 什么是红黑树

做开发的朋友一定知道接口这个东西:定义接口,给出实现。一个接口可以有多种不同的实现,但是这些实现都会满足接口中的声明。
例如,我们定义手机是一个可用作通讯的工具,作为它的实现,三星,苹果,华为推出了各式各样的产品。
红黑树的本质其实也是对概念模型:2-3-4树的一种实现,因此我们先来关注2-3-4树

这里讲的还是很容易理解和明白的,不管是什么算法、数据结构,首先会有一个模型或者说是概念,在理论上是可能的。能够达到我们对这种算法的要求,时间、性能、复杂度等等,然后会根据这个模型去设计或者说实现我们的算法,

2-3-4树中的2节点对应着红黑树中的黑色节点,而2-3-4树中的非2节点是以红节点+黑节点的方式存在,红节点的意义是与黑色父节点结合,表达着2-3-4树中的3,4节点。

这里可以看到一个2-3节点的红黑方式的展示
img

最后关于4节点的介绍,感觉用到的很少

img

算法4中关于不同算法的讲解还基本是从概念出发的

算法4中给出的红黑树是基于2-3树实现,而且这种实现的红黑树十分特殊,它要求概念模型中的3节点在红黑树中必须用左倾的红色节点来表示。这种限定能够很大的减少红黑树调整过程中的复杂性,我们将在接下来的内容中体会到这一点。

其实当时看算法4的时候带的功利性太强,看的时候就是看怎么能够快速理解这些算法,或者说能够手撕这些算法,用在面试的时候。
俗话说得好,磨刀不误砍柴工。当你希望能够掌握一个复杂度高的技能的时候,往往需要能够先理解背后的基本原理,基本的概念,来龙去脉。等真正理解算法、掌握算法之后,再去实现就会事半功倍。
这也是我现在工作中所理解到的,之前总是会很着急先上手,期望通过直接手撕代码,快速掌握。后面出了问题,就很容易陷入迷茫,不知所措。
但如果你一开始就能够

让我们继续,如何实现数据结构在增加、删除过程中的动态平衡,让数据在更新之后还能够使保持B树的状态,这样再次查找时就是$\log(N)$的时间

关于insert的情况 2-3 树

2节点

img

3节点

img

对于三节点来说会有一个动态平衡的过程,零时4节点的分解

分解过程,应该还会继续分解下去,因为这里是左顷红黑树

而红黑树之所以需要在插入后进行调整,正是因为可能存在着概念模型中的临时4节点(反应在红黑树中是双红的情况)
img

如果我们仔细回顾的话,其实在红黑树中的红色节点是又上下文决定的

二叉查找树的删除是一个很有意思的问题,不同于插入的是,待删除的元素并不能保证一定出现在树中的叶子节点。这将带来一个棘手的情景,即我们需要从树的中间部分取走一个元素,而且在取走后还需要经过调整来使得整颗树满足平衡的性质。从树的中间部分直接取走一个节点的场景实在是太多,也牵扯到了太多相关的节点,这种操作很难实现。
好在有人提出了一个观点,我们对查找树中一个节点的删除,其实可以不必真的改动这个节点的位置。由于查找树的特殊性质,将某个元素节点删除后,它有两个最佳替代者,分别是有序序列中的前驱元素和后继元素

果然是一代代技术积累和迭代的过程

接下来就是左旋和右旋,用来在红黑树中调整树中的成员的
个人感觉红黑树的插入和删除之后树的再平衡过程,就是利用了2-3-4节点,只需要进行局部的调整就能够使树再平衡

这里有一种情况我不是很理解

  • 为什么插入的18是红节点
    这里的数据结构,右边是一个三节点,再插入一个成员的的话就是四节点,需要进行4节点的转化
  • 这里调整之后变成了右顷,最后还是要调整过来?
    这里就是右顷的三节点

img

img

转化4节点
img

看来需要重新回到之前的部分,重温下关于红节点、黑节点的定义和作用

  1. 颜色属性是用来表示2-3-4树中的不同节点
  2. 2节点就是黑色的
  3. 非2节点是以红节点+黑节点的方式存在
  4. 红节点与黑父节点结合表达3-4节点

img

后面两种insert的情况其实最后生成的树的结构和第一种情况是一样的,只不过针对不同的数据情况最后的数据的位置不一样

左顷红黑树的delete操作

左倾红黑树的删除需要借鉴上文中提到的二叉查找树通用的删除策略,当我们要删除某个节点的时候选择它的前驱节点或者后继节点元素来替代它,转而删除它的前驱/后继节点
在这个例子中,我选择用后继节点来替代被删除节点。

删除的过程就是不断的调整的过程

posted @   panda顾  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示