30张图带你彻底理解红黑树!看完后不理解欢迎来找茬!

数据结构-史上最强图解红黑树 文档主要UI最舒适的方式,用图文并茂的方式为大家展现和剖析红黑树的内在逻辑 立即下载

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

接下来通过三十张图片带你彻底了解图片,本文适合入门跟初学者,多图预警,流量党慎入!!!

当在 10 亿数据中只需要进行十几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀!

—学红黑树有感

在这里插入图片描述

终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。
在这里插入图片描述

红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。

如果你在学习过程中也会存在我的疑问,那么本文对你会有帮助,本文帮助你全面、彻底地理解红黑树!

本文将通过图文的方式讲解红黑树的知识点,并且不会涉及到任何代码,相信我,在懂得红黑树实现原理前,看代码会一头雾水的,当原理懂了,代码也就按部就班写而已,没任何难度。

阅读本文你需具备知识点:

二叉查找树
完美平衡二叉树

红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态。

现在在脑海想下怎么实现?是不是太多情景需要考虑了?啧啧,先别急,通过本文的学习后,你会觉得,其实也不过如此而已。好吧,我们先来看下红黑树的定义和一些基本性质。

红黑树定义和性质

红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:

每个节点要么是黑色,要么是红色。
根节点是黑色。
每个叶子节点(Nil)是黑色。
每个红色结点的两个子结点一定都是黑色。
任意一结点到每个叶子结点的路径都包含数量相同的黑结点。

从性质 5 又可以推出:如果一个结点存在黑子结点,那么该结点肯定有两个子结点。

在这里插入图片描述
图 1:一棵简单的红黑树

上图就是一颗简单的红黑树。其中 Nil 为叶子结点,并且它是黑色的。(值得提醒注意的是,在 Java 中,叶子结点是为 null 的结点。)

红黑树并不是一个完美平衡二叉查找树,从图 1 可以看到,根结点 P 的左子树显然比右子树高。

但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质 5)。所以我们叫红黑树这种平衡为黑色完美平衡。

介绍到此,为了后面讲解不至于混淆,我们还需要来约定下红黑树一些结点的叫法,如图 2 所示:

在这里插入图片描述
图 2:结点叫法约定

我们把正在处理(遍历)的结点叫做当前结点,如图 2 中的 D,它的父亲叫做父结点,它的父亲的另外一个子结点叫做兄弟结点,父亲的父亲叫做祖父结点。

前面讲到红黑树能自平衡,它靠的是什么?有如下三种操作:

左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。如图 3。
右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变。如图 4。
变色:结点的颜色由红变黑或由黑变红。
在这里插入图片描述
图 3:左旋

在这里插入图片描述
图 4:右旋

上面所说的旋转结点也即旋转的支点,图 4 和图 5 中的 P 结点。我们先忽略颜色,可以看到旋转操作不会影响旋转结点的父结点,父结点以上的结构还是保持不变的。

左旋只影响旋转结点和其右子树的结构,把右子树的结点往左子树挪了;右旋只影响旋转结点和其左子树的结构,把左子树的结点往右子树挪了。

所以旋转操作是局部的。另外可以看出旋转能保持红黑树平衡的一些端详了:当一边子树的结点少了,那么向另外一边子树“借”一些结点;当一边子树的结点多了,那么向另外一边子树“租”一些结点。

但要保持红黑树的性质,结点不能乱挪,还得靠变色了。怎么变?具体情景有不同变法,后面会具体讲到,现在只需要记住红黑树总是通过旋转和变色达到自平衡。

Balabala 了这么多,相信你对红黑树有一定印象了,那么现在来考考你。

思考题 1:黑结点可以同时包含一个红子结点和一个黑子结点吗? (答案见文末)

接下来先讲解红黑树的查找热热身。

红黑树查找

因为红黑树是一颗二叉平衡树,并且查找不会破坏树的平衡,所以查找跟二叉平衡树的查找无异:

从根结点开始查找,把根结点设置为当前结点。
若当前结点为空,返回 null。
若当前结点不为空,用当前结点的 key 跟查找 key 作比较。
若当前结点 key 等于查找 key,那么该 key 就是查找目标,返回当前结点。
若当前结点 key 大于查找 key,把当前结点的左子结点设置为当前结点,重复步骤 2。
若当前结点 key 小于查找 key,把当前结点的右子结点设置为当前结点,重复步骤 2。

如图 5 所示:

在这里插入图片描述
图 5:二叉树查找流程图

非常简单,但简单不代表它效率不好。正由于红黑树总保持黑色完美平衡,所以它的查找最坏时间复杂度为 O(2lgN),也即整颗树刚好红黑相隔的时候。

能有这么好的查找效率得益于红黑树自平衡的特性,而这背后的付出,红黑树的插入操作功不可没。

红黑树插入

插入操作包括两部分工作:一是查找插入的位置;二是插入后自平衡。

查找插入的父结点很简单,跟查找操作区别不大:

从根结点开始查找。
若根结点为空,那么插入结点作为根结点,结束。
若根结点不为空,那么把根结点作为当前结点。
若当前结点为 null,返回当前结点的父结点,结束。
若当前结点 key 等于查找 key,那么该 key 所在结点就是插入结点,更新结点的值,结束。
若当前结点 key 大于查找 key,把当前结点的左子结点设置为当前结点,重复步骤 4。
若当前结点 key 小于查找 key,把当前结点的右子结点设置为当前结点,重复步骤 4。

如图 6 所示:

在这里插入图片描述

图 6:红黑树插入位置查找

OK,插入位置已经找到,把插入结点放到正确的位置就可以啦,但插入结点应该是什么颜色呢?

答案是红色。理由很简单,红色在父结点(如果存在)为黑色结点时,红黑树的黑色平衡没被破坏,不需要做自平衡操作。

但如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多 1,必须做自平衡。

所有插入情景如图 7 所示:

在这里插入图片描述
图 7:红黑树插入情景

嗯,插入情景很多呢,8 种插入情景!但情景 1、2 和 3 的处理很简单,而情景 4.2 和情景 4.3 只是方向反转而已。

懂得了一种情景就能推出另外一种情景,所以总体来看,并不复杂,后续我们将一个一个情景来看,把它彻底搞懂。

另外,根据二叉树的性质,除了情景 2,所有插入操作都是在叶子结点进行的。这点应该不难理解,因为查找插入位置时,我们就是在找子结点为空的父结点的。

在开始每个情景的讲解前,我们还是先来约定下,如图 8 所示:
在这里插入图片描述

图 8:插入操作结点的叫法约定

图 8 的字母并不代表结点 Key 的大小。I 表示插入结点,P 表示插入结点的父结点,S 表示插入结点的叔叔结点,PP 表示插入结点的祖父结点。

好了,下面让我们一个一个来分析每个插入的情景以及处理。

情景 1:红黑树为空树

最简单的一种情景,直接把插入结点作为根结点就行,但注意,根据红黑树性质 2:根节点是黑色。还需要把插入结点设为黑色。

处理:把插入结点作为根结点,并把结点设置为黑色。

情景 2:插入结点的 Key 已存在

插入结点的 Key 已存在,既然红黑树总保持平衡,在插入前红黑树已经是平衡的,那么把插入结点设置为将要替代结点的颜色,再把结点的值更新就完成插入。

处理:把 I 设为当前结点的颜色,更新当前结点的值为插入结点的值。

情景 3:插入结点的父结点为黑结点

由于插入的结点是红色的,当插入结点是黑色时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。

处理:直接插入。

情景 4:插入结点的父结点为红结点

再次回想下红黑树的性质 2:根结点是黑色。如果插入的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。这点很重要,因为后续的旋转操作肯定需要祖父结点的参与。

情景 4 又分为很多子情景,下面将进入重点部分,各位看官请留神了。

插入情景 4.1:叔叔结点存在并且为红结点。

从红黑树性质 4 可以,祖父结点肯定为黑结点,因为不可以同时存在两个相连的红结点。

那么此时该插入子树的红黑层数的情况是:黑红红。显然最简单的处理方式是把其改为:红黑红。如图 9 和图 10 所示。

处理:将 P 和 S 设置为黑色,将 PP 设置为红色,把 PP 设置为当前插入结点。

在这里插入图片描述
图 9:插入情景 4.1_1
在这里插入图片描述

图 10:插入情景 4.1_2

可以看到,我们把 PP 结点设为红色了,如果 PP 的父结点是黑色,那么无需再做任何处理。

但如果 PP 的父结点是红色,根据性质 4,此时红黑树已不平衡了,所以还需要把 PP 当作新的插入结点,继续做插入操作自平衡处理,直到平衡为止。

试想下 PP 刚好为根结点时,那么根据性质 2,我们必须把 PP 重新设为黑色,那么树的红黑结构变为:黑黑红。

换句话说,从根结点到叶子结点的路径中,黑色结点增加了。这也是唯一一种会增加红黑树黑色结点层数的插入情景。

我们还可以总结出另外一个经验:红黑树的生长是自底向上的。这点不同于普通的二叉查找树,普通的二叉查找树的生长是自顶向下的。

插入情景 4.2:叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的左子结点。

单纯从插入前来看,也即不算情景 4.1 自底向上处理时的情况,叔叔结点非红即为叶子结点(Nil)。

因为如果叔叔结点为黑结点,而父结点为红结点,那么叔叔结点所在的子树的黑色结点就比父结点所在子树的多了,这不满足红黑树的性质 5。后续情景同样如此,不再多做说明了。

前文说了,需要旋转操作时,肯定一边子树的结点多了或少了,需要租或借给另一边。插入显然是多的情况,那么把多的结点租给另一边子树就可以了。

插入情景 4.2.1:插入结点是其父结点的左子结点。

处理:将 P 设为黑色,将 PP 设为红色,对 PP 进行右旋。
在这里插入图片描述

图 11:插入情景 4.2.1

由图 11 可得,左边两个红结点,右边不存在,那么一边一个刚刚好,并且因为为红色,肯定不会破坏树的平衡。

咦,可以把 PP 设为红色,I 和 P 设为黑色吗?答案是可以!看过《算法:第 4 版》的同学可能知道,书中讲解的就是把 PP 设为红色,I 和 P 设为黑色。

但把 PP 设为红色,显然又会出现情景 4.1 的情况,需要自底向上处理,做多了无谓的操作,既然能自己消化就不要麻烦祖辈们啦。

插入情景 4.2.2:插入结点是其父结点的右子结点。

这种情景显然可以转换为情景 4.2.1,如图 12 所示,不做过多说明了。
在这里插入图片描述

图 12:插入情景 4.2.2

处理:对 P 进行左旋,把 P 设置为插入结点,得到情景 4.2.1,进行情景 4.2.1 的处理。

插入情景 4.3:叔叔结点不存在或为黑结点,并且插入结点的父亲结点是祖父结点的右子结点。

该情景对应情景 4.2,只是方向反转,不做过多说明了,直接看图。

插入情景 4.3.1:插入结点是其父结点的右子结点。

在这里插入图片描述
图 13:插入情景 4.3.1

处理:将 P 设为黑色,将 PP 设为红色,对 PP 进行左旋。

插入情景 4.3.2:插入结点是其父结点的右子结点。
在这里插入图片描述

图 14:插入情景 4.3.2

处理:对 P 进行右旋,把 P 设置为插入结点,得到情景 4.3.1,进行情景 4.3.1 的处理。

好了,讲完插入的所有情景了。可能有同学会想:上面的情景举例的都是第一次插入而不包含自底向上处理的情况,那么上面所说的情景都适合自底向上的情况吗?答案是肯定的。

理由很简单,只要每棵子树都能自平衡,那么整棵树最终总是平衡的。好吧,在出个习题,请大家拿出笔和纸画下试试(请务必动手画下,加深印象)。

习题 1:请画出图 15 的插入自平衡处理过程。(答案见文末)

在这里插入图片描述
图 15:习题 1

红黑树删除

红黑树插入已经够复杂了,但删除更复杂,也是红黑树最复杂的操作了。但稳住,胜利的曙光就在前面了!

红黑树的删除操作也包括两部分工作:一是查找目标结点;二是删除后自平衡。

查找目标结点显然可以复用查找操作,当不存在目标结点时,忽略本次操作;当存在目标结点时,删除后就得做自平衡处理了。

删除了结点后,我们还需要找结点来替代删除结点的位置,不然子树跟父辈结点断开了,除非删除结点刚好没子结点,那么就不需要替代。

二叉树删除结点找替代结点有 3 种情景:

若删除结点无子结点,直接删除。
若删除结点只有一个子结点,用子结点替换删除结点。
若删除结点有两个子结点,用后继结点(大于删除结点的最小结点)替换删除结点。

补充说明下,情景 3 的后继结点是大于删除结点的最小结点,也是删除结点的右子树中最右结点。

那么可以拿前继结点(删除结点的左子树最左结点)替代吗?可以的。但习惯上大多都是拿后继结点来替代,后文的讲解也是用后继结点来替代。

另外告诉大家一种找前继和后继结点的直观的方法(不知为何没人提过,大家都知道?):把二叉树所有结点投射在X轴上,所有结点都是从左到右排好序的,所有目标结点的前后结点就是对应前继和后继结点。

如图 16 所示:
在这里插入图片描述

图 16:二叉树投射 x 轴后有序

接下来,讲一个重要的思路:删除结点被替代后,在不考虑结点的键值的情况下,对于树来说,可以认为删除的是替代结点!话很苍白,我们看图 17。
在这里插入图片描述

图 17:删除结点换位思路

在不看键值对的情况下,图 17 的红黑树最终结果是删除了 Q 所在位置的结点!这种思路非常重要,大大简化了后文讲解红黑树删除的情景!

基于此,上面所说的 3 种二叉树的删除情景可以相互转换并且最终都是转换为情景 1。

情景 2:删除结点用其唯一的子结点替换,子结点替换为删除结点后,可以认为删除的是子结点,若子结点又有两个子结点,那么相当于转换为情景 3,一直自顶向下转换,总是能转换为情景 1。(对于红黑树来说,根据性质 5.1,只存在一个子结点的结点肯定在树末了)

情景 3:删除结点用后继结点(肯定不存在左结点),如果后继结点有右子结点,那么相当于转换为情景 2,否则转为情景 1。

二叉树删除结点情景关系图如图 18 所示:

在这里插入图片描述
图 18:二叉树删除情景转换

综上所述,删除操作删除的结点可以看作删除替代结点,而替代结点最后总是在树末。

有了这结论,我们讨论的删除红黑树的情景就少了很多,因为我们只考虑删除树末结点的情景了。

同样的,我们也是先来总体看下删除操作的所有情景,如图 19 所示:
在这里插入图片描述

图 19:红黑树删除情景

哈哈,是的,即使简化了还是有 9 种情景!但跟插入操作一样,存在左右对称的情景,只是方向变了,没有本质区别。同样的,我们还是来约定下,如图 20 所示:

在这里插入图片描述
图 20:删除操作结点的叫法约定

图 20 的字母并不代表结点 Key 的大小。R 表示替代结点,P 表示替代结点的父结点,S 表示替代结点的兄弟结点,SL 表示兄弟结点的左子结点,SR 表示兄弟结点的右子结点。灰色结点表示它可以是红色也可以是黑色。

值得特别提醒的是,R 是即将被替换到删除结点的位置的替代结点,在删除前,它还在原来所在位置参与树的子平衡,平衡后再替换到删除结点的位置,才算删除完成。

万事俱备,我们进入最后的也是最难的讲解。

删除情景 1:替换结点是红色结点。

我们把替换结点换到了删除结点的位置时,由于替换结点是红色,删除了也不会影响红黑树的平衡,只要把替换结点的颜色设为删除的结点的颜色即可重新平衡。

处理:颜色变为删除结点的颜色。

删除情景 2:替换结点是黑结点。

当替换结点是黑色时,我们就不得不进行自平衡处理了。我们必须还得考虑替换结点是其父结点的左子结点还是右子结点,来做不同的旋转操作,使树重新平衡。

删除情景 2.1:替换结点是其父结点的左子结点。

删除情景 2.1.1:替换结点的兄弟结点是红结点。
在这里插入图片描述

图 21:删除情景 2.1.1

若兄弟结点是红结点,那么根据性质 4,兄弟结点的父结点和子结点肯定为黑色,不会有其他子情景,我们按图 21 处理,得到删除情景 2.1.2.3(后续讲解,这里先记住,此时 R 仍然是替代结点,它的新的兄弟结点 SL 和兄弟结点的子结点都是黑色)。

处理:将 S 设为黑色,将 P 设为红色,对 P 进行左旋,得到情景 2.1.2.3,进行情景 2.1.2.3 的处理。

删除情景 2.1.2:替换结点的兄弟结点是黑结点。

当兄弟结点为黑色时,其父结点和子结点的具体颜色也无法确定(如果也不考虑自底向上的情况,子结点非红即为叶子结点Nil,Nil结点为黑结点),此时又得考虑多种子情景。

删除情景 2.1.2.1:替换结点的兄弟结点的右子结点是红结点,左子结点任意颜色。

在这里插入图片描述
图 22:删除情景 2.1.2.1

即将删除的左子树的一个黑色结点,显然左子树的黑色结点少 1 了,然而右子树又有红色结点,那么我们直接向右子树“借”个红结点来补充黑结点就好啦,此时肯定需要用旋转处理了,如图 22 所示。

处理:将 S 的颜色设为 P 的颜色,将 P 设为黑色,将 SR 设为黑色,对 P 进行左旋。

平衡后的图怎么不满足红黑树的性质?前文提醒过,R 是即将替换的,它还参与树的自平衡,平衡后再替换到删除结点的位置,所以 R 最终可以看作是删除的。

另外图 2.1.2.1 是考虑到第一次替换和自底向上处理的情况,如果只考虑第一次替换的情况,根据红黑树性质,SL 肯定是红色或为 Nil,所以最终结果树是平衡的。

如果是自底向上处理的情况,同样,每棵子树都保持平衡状态,最终整棵树肯定是平衡的。后续的情景同理,不做过多说明了。

删除情景 2.1.2.2:替换结点的兄弟结点的右子结点为黑结点,左子结点为红结点。

兄弟结点所在的子树有红结点,我们总是可以向兄弟子树借个红结点过来,显然该情景可以转换为情景 2.1.2.1。如图 23 所示:

在这里插入图片描述
图 23:删除情景 2.1.2.2

处理:将 S 设为红色,将 SL 设为黑色,对 S 进行右旋,得到情景 2.1.2.1,进行情景 2.1.2.1 的处理。

删除情景 2.1.2.3:替换结点的兄弟结点的子结点都为黑结点。

好了,此次兄弟子树都没红结点“借”了,兄弟帮忙不了,找父母呗,这种情景我们把兄弟结点设为红色,再把父结点当作替代结点,自底向上处理,去找父结点的兄弟结点去“借”。

但为什么需要把兄弟结点设为红色呢?显然是为了在 P 所在的子树中保证平衡(R 即将删除,少了一个黑色结点,子树也需要少一个),后续的平衡工作交给父辈们考虑了,还是那句,当每棵子树都保持平衡时,最终整棵总是平衡的。
在这里插入图片描述

图 24:情景 2.1.2.3

处理:将 S 设为红色,把 P 作为新的替换结点,重新进行删除结点情景处理。

删除情景 2.2:替换结点是其父结点的右子结点。

好啦,右边的操作也是方向相反,不做过多说明了,相信理解了删除情景 2.1 后,肯定可以理解 2.2。

删除情景 2.2.1:替换结点的兄弟结点是红结点。

在这里插入图片描述
图 25:删除情景 2.2.1

处理:将 S 设为黑色,将 P 设为红色,对 P 进行右旋,得到情景 2.2.2.3,进行情景 2.2.2.3 的处理。

删除情景 2.2.2:替换结点的兄弟结点是黑结点。

删除情景 2.2.2.1:替换结点的兄弟结点的左子结点是红结点,右子结点任意颜色。
在这里插入图片描述

图 26:删除情景 2.2.2.1

处理:将 S 的颜色设为 P 的颜色,将 P 设为黑色,将 SL 设为黑色,对 P 进行右旋。

删除情景 2.2.2.2:替换结点的兄弟结点的左子结点为黑结点,右子结点为红结点。
在这里插入图片描述

图 27:删除情景 2.2.2.2

处理:将 S 设为红色,将 SR 设为黑色,对 S 进行左旋,得到情景 2.2.2.1,进行情景 2.2.2.1 的处理。

删除情景 2.2.2.3:替换结点的兄弟结点的子结点都为黑结点。
在这里插入图片描述

图 28:删除情景 2.2.2.3

处理:将 S 设为红色,把 P 作为新的替换结点,重新进行删除结点情景处理。

综上,红黑树删除后自平衡的处理可以总结为:

自己能搞定的自消化(情景 1)
自己不能搞定的叫兄弟帮忙(除了情景 1、情景 2.1.2.3 和情景 2.2.2.3)
兄弟都帮忙不了的,通过父母,找远方亲戚(情景2.1.2.3和情景2.2.2.3)

哈哈,是不是跟现实中很像,当我们有困难时,首先先自己解决,自己无力了找兄弟姐妹帮忙,如果连兄弟姐妹都帮不上,再去找远方的亲戚了。这样记忆应该会好记点~

最后再做个习题加深理解(请不熟悉的同学务必动手画下)。

习题 2:请画出图 29 的删除自平衡处理过程。

在这里插入图片描述
习题 2

写在后面

相信看了这篇文章后,再去看 Java 和 HashMap 和 TreeMap 的源码绝对没难度!最后来看下思考题和习题的答案吧。

思考题 1:黑结点可以同时包含一个红子结点和一个黑子结点吗?

答:可以。如下图的 F 结点:
在这里插入图片描述

习题 1:请画出图 15 的插入自平衡处理过程。

答案如下图:
在这里插入图片描述

习题 2:请画出图 29 的删除自平衡处理过程。

答案如下图:

在这里插入图片描述

手把手调试AD9653的LVDS数据采集:从VIO抓波形到用F0/F8帧对齐的实战心得 本文详细介绍了AD9653高速ADC与Xilinx 7系列FPGA(如7z035)的LVDS数据采集调试实战经验。从硬件环境搭建、Vivado工具链配置到LVDS数据对齐技巧,重点分享了利用VIO抓取波形和使用F0/F8帧对齐的实用方法,帮助工程师快速解决高速数据采集系统中的信号完整性问题。 阅读详情

相关推荐

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 210

算法基础: 什么是红黑树?

介绍红黑树

微不足道的博客 1251

用V E S C 6-M K V I 第六代调速控制器给VESC电调刷固件

文章摘要:本文介绍了一款先进的电机控制器,具备多项创新技术。核心亮点包括三相电流/电压检测、四象限无缝运行、多模式兼容等先进电机控制技术,以及智能感知与安全保护、高效能电源管理、多样化连接与扩展功能。此外,该控制器支持实时数据监测与用户交互,具备开源生态和工业级可靠性,适用于电动载具、机器人及工业领域。用户需注意散热要求和兼容性提示,可通过VESC-Tool软件进行灵活配置。产品可在常竹科技淘宝店购买,并加入技术交流群获取支持。

2403_89422757的博客 1364

图解红黑树

要学习红黑树,咱们需要先来理解二叉查找树(Binary Search Tree)。 二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树,就是一颗典型的二叉查找树: 这种方式正是二分查找的思想,查找所需的最大次数等同于二叉查找树的高度。 在插入节点的时候也...

qq_36653524的博客 243

验证码接收平台搭建教程(含源代码)

在很多注册流程中,我们常常需要通过短信验证码验证用户的身份。本教程将手把手教你搭建一个验证码接收平台,用于自动接收并展示来自短信网关或短信转发器的验证码。⚠️ 本教程仅供学习使用,请勿用于任何非法用途!本教程展示了一个简单的验证码接收平台的搭建流程,从后端到前端完整实现。你可以将其用于学习 Web 开发、数据库操作以及 Flask 项目部署。访问我的优快云主页。

weixin_52548902的博客 4081

ABAP FB05 清账实战:POSTING_INTERFACE_CLEARING 核心参数与业务场景解析

本文深入解析ABAP FB05清账操作中的核心函数POSTING_INTERFACE_CLEARING,详细讲解其关键参数与业务场景应用。通过实战案例展示收款清账(EINGZAHL)流程,提供常见错误排查方法,并分享批量清账优化与财务凭证集成的高级技巧,帮助开发者高效处理SAP财务模块清账需求。

weixin_33423874的博客 474

图解红黑树的前世今生

前言 红黑树是面试中一个很经典也很有难度的知识点,面试官比较喜欢问这方面的问题,可能有的人会觉得学习这个知识点太难,也觉得问得少没必要掌握,我可以明确告诉大家,当你去面试时HashMap是常问的问题,而问到HashMap就必然会和红黑树有关联,而HashMap的底层实现就是红黑树+链表。网上很多博客都不能够清晰完整的描述出红黑树的整个体系,对于红黑平衡调整的细节部分也没有很详尽的介绍,因此给学习带来了较大的困难,只要你足够认真,读完这篇文章能够真正的将红黑树变成自己的知识点。 2-3-4树 红黑树的本质其实

养歌的博客 1251

用友U8自定义按钮开发:从基础配置到实战业务集成

本文详细介绍了用友U8自定义按钮开发的完整流程,从基础配置到实战业务集成。通过实际案例演示如何在U8系统中添加和替换功能按钮,包括数据库配置、SQL脚本编写和VB组件开发等关键技术点,帮助企业用户实现业务场景的深度定制。

weixin_29698641的博客 254

【数据结构取经之路】图解红黑树

AVL-tree之外,另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree),这名字听起来除了很抽象外,还颇具大哥味哈,会不会很难?客观地说,难度是有的,下面我们细细道来。//结点的颜色//红黑树结点的定义//结点的左孩子//结点的右孩子//结点的父节点//结点的颜色T _data;//结点的数据域{}以上就是红黑树节点定义,但有两个问题:为什么需要指向父节点的指针?为什么要将结点的默认颜色设置成黑色?先来回答第一个问题,在旋转时需要访问父节点,所以引入了指向父节点的指针。

记录代码路上的点滴思考。 1301

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 452

156、手机摄像头模组结构拆解:从保护盖到 FPC 连接器的完整装配剖面

本文深入解析手机摄像头模组结构设计要点。作者结合项目经验,指出保护盖密封胶在低温收缩会导致边缘漏光问题,强调结构细节比算法参数更关键。文章逐层拆解模组组件:保护盖厚度需平衡抗冲击与光学性能;镜筒内镜片组装配顺序和公差控制直接影响成像质量;IR滤光片厚度公差±0.02mm会改变红外截止波长;CSP封装需注意金线加固;FPC连接器的信号完整性和机械可靠性设计。最后给出5条实用建议,包括密封胶选型、镜片对位检测等,强调模组结构设计是"一票否决制"的基础工程。(149字)

sundong_81的博客 104

C++实现红黑树

/红黑树结点颜色,_kv(kv),_col(Red)//初始值为红色{}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?如果将结点的默认颜色设置为黑色,那么就会和性质4相冲突,它是必然会发生的如果是红色就会有两种情况:1.它的父亲结点为黑色时,这时可以直接插入,不需要调整2.它的父亲结点为红色时,就会与性质3相冲突,这时将需要进行调整使用黑色作为结点的默认颜色一定会出问题,但是使用红色默认颜色不一定会出问题,这就是为什么使用红色作为默认颜色而不是黑色的原因。

m0_73634434的博客 1146

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 71

红黑树的原理_30张图带你彻底理解红黑树!看完后不理解欢迎来找茬

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。接下来通过三十张图片带你彻底了解图片,本文适合入门跟初学者,多图预警,流量党慎入!!!当在 10 亿数据中只需要进行十几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀!—学红黑树有感终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是...

weixin_39859819的博客 424

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

存在就不插入_30张图带你彻底理解红黑树!看完后不理解欢迎来找茬!

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。接下来通过三十张图片带你彻底了解图片,本文适合入门跟初学者,多图预警,流量党慎入!!!当在 10 亿数据中只需要进行十几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀!—学红黑树有感终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是...

weixin_42364855的博客 154

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

红黑树分为红和黑有什么好处_30张图带你彻底理解红黑树!看完后不理解欢迎来找茬!...

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。接下来通过三十张图片带你彻底了解图片,本文适合入门跟初学者,多图预警,流量党慎入!!!当在 10 亿数据中只需要进行十几次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀!—学红黑树有感终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是...

weixin_39568597的博客 214

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

(纯干货,非水文)一文1.5w字30图,彻底通透理解红黑树

写在前面 当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀! —— 学红黑树有感。 终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我的疑问,那么本文对你会有帮助,本文帮助你全面、彻底地理解红黑树! 本文将通过图文的方式讲解红黑树的知识点,并且不会涉及到任何代

Spring boot 3515

红黑树理解(四) 左旋

什么是黑高? 红黑树中从任一节点到它的子树的每个叶子节点,黑色节点的数量都是相同的,这个数量被称为这个节点的黑高 7张图带你了解红黑树变色、左旋和右旋 算法导论习题练习——红黑树的插入和删除 动画演示!红黑树解析 【算法导论】红黑树详解之一(插入) 红黑树的左旋,有没有统一的解释? 以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变。 简单的讲:左旋就是旋转节点,向左偏移。 30张图带你彻底理解红黑树 ...

知道这个有什么用? 1328

RBTree(红黑树)的介绍和实现

此篇对红黑树超详细的通俗易懂的理解,能让你对红黑树的介绍以及构建能有不一样的认识,对它的构建等一些步骤全新理解,感谢支持

羑悻的博客. 3551

8 张图,看你是否理解 Java

点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!翻译:era_misawww.jianshu.com/p/debf760b96021、字符串不变性2、equals()方...

Java笔记虾 338

哈希表与树笔记(红黑树)(六)

红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 性质1. 节点是红色或黑色。 性质2. 根节点是黑色。 性质3.所有叶子都是黑色。(叶子是NUIL节点) 性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5.. 从任一节点到其每个叶子...

qq_40667603的博客 247

彻底理解HashMap及LinkedHashMap

欢迎关注方志朋的博客,回复”666“获面试宝典来源:https://blog.youkuaiyun.com/fuzhongmin05/article/details/104355841HashMap是...

方志朋的博客 1747

树 - 红黑树(R-B Tree)

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组,是平衡二叉树和AVL树的折中。

珍惜当下 974

红黑树(RBTree)之插入结点图解

红黑树之建树过程图解

码不停蹄 3703

STL源码剖析---红黑树原理详解下

STL源码剖析---红黑树原理详解下

fguihbfg的博客 252

【C++庖丁解牛】高阶数据结构---红黑树详解(万字超详细全面介绍红黑树)(1)

在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。需要完整版PDF学习资源私我。

2401_84300128的博客 758
上一篇: Redis高可用原理,这下能看懂了吧
下一篇: 老鸟带你回顾新人Java不容错过的八本好书
程序媛月下
博客等级 码龄7年 5262粉丝 462原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值