首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

30 张图带你彻底理解

也是二叉查找,我们知道,二叉查找这一数据结构并不难,而之所以难它是自平衡二叉查找进行插入和删除等可能会破坏平衡操作,需要重新自处理达到平衡状态。...必须满足下面性质: 性质1:每个节点要么黑色,要么红色。 性质2:根节点黑色。 性质3:每个叶子节点(NIL)黑色。 性质4:每个红色结点两个子结点一定都是黑色。...能有这么好查找效率得益于自平衡特性,而这背后付出,插入操作功不可没~ 插入 插入操作包括两部分工作:一查找插入位置;二插入后自平衡。...答案红色。理由很简单,红色父结点(如果存在)为黑色结点黑色平衡没被破坏,不需要做自平衡操作。但如果插入结点黑色,那么插入位置所在子树黑色结点总是多1,必须做自平衡。...插入情景1:为空 最简单一种情景,直接把插入结点作为根结点就行,但注意,根据性质2:根节点黑色。还需要把插入结点设为黑色。 处理:把插入结点作为根结点,并把结点设置为黑色

74420

这 30 张图带你读懂

也是二叉查找,我们知道,二叉查找这一数据结构并不难,而之所以难它是自平衡二叉查找进行插入和删除等可能会破坏平衡操作,需要重新自处理达到平衡状态。...必须满足下面性质: 性质1:每个节点要么黑色,要么红色。 性质2:根节点黑色。 性质3:每个叶子节点(NIL)黑色。 性质4:每个红色结点两个子结点一定都是黑色。...能有这么好查找效率得益于自平衡特性,而这背后付出,插入操作功不可没~ 插入 插入操作包括两部分工作:一查找插入位置;二插入后自平衡。...理由很简单,红色父结点(如果存在)为黑色结点黑色平衡没被破坏,不需要做自平衡操作。但如果插入结点黑色,那么插入位置所在子树黑色结点总是多1,必须做自平衡。...插入情景1:为空 最简单一种情景,直接把插入结点作为根结点就行,但注意,根据性质2:根节点黑色。还需要把插入结点设为黑色。 处理:把插入结点作为根结点,并把结点设置为黑色

39430
您找到你想要的搜索结果了吗?
是的
没有找到

30 张图带你彻底理解

也是二叉查找,我们知道,二叉查找这一数据结构并不难,而之所以难它是自平衡二叉查找进行插入和删除等可能会破坏平衡操作,需要重新自处理达到平衡状态。...必须满足下面性质: 性质1:每个节点要么黑色,要么红色。 性质2:根节点黑色。 性质3:每个叶子节点(NIL)黑色。 性质4:每个红色结点两个子结点一定都是黑色。...能有这么好查找效率得益于自平衡特性,而这背后付出,插入操作功不可没~ 插入 插入操作包括两部分工作:一查找插入位置;二插入后自平衡。...理由很简单,红色父结点(如果存在)为黑色结点黑色平衡没被破坏,不需要做自平衡操作。但如果插入结点黑色,那么插入位置所在子树黑色结点总是多1,必须做自平衡。...插入情景1:为空 最简单一种情景,直接把插入结点作为根结点就行,但注意,根据性质2:根节点黑色。还需要把插入结点设为黑色。 处理:把插入结点作为根结点,并把结点设置为黑色

1K20

数据结构:

简介 R-B Tree,全称是Red-Black Tree,又称为“”,一种特殊二叉排序每个节点上都有存储位表示节点颜色,可以是(Red)或(Black)。...我们清晰发现,它们对称。无论左旋还是右旋,被旋转旋转二叉查找,并且旋转之后仍然一颗二叉查找。...这个应该很容易想明白,因为变换操作之前,该,“父节点红色,那么“祖父节点”一定是黑色。...和二叉搜索删除类似,只不过加上颜色属性(这里节点均指非NULL节点): 无子节点,删除节点可能为红色或者黑色; 1.1 如果为红色,直接删除即可,不会影响黑色节点数量; 1.2 如果为黑色...,则需要进行删除平衡操作了; 只有一个子节点,删除节点只能黑色,其子节点为红色,否则无法满足性质了。

61311

什么

正文 也是二叉查找,我们知道,二叉查找这一数据结构并不难,而之所以难它是自平衡二叉查找进行插入和删除等可能会破坏平衡操作,需要重新自处理达到平衡状态。...必须满足下面性质: 性质1:每个节点要么黑色,要么红色。 性质2:根节点黑色。 性质3:每个叶子节点(NIL)黑色。 性质4:每个红色结点两个子结点一定都是黑色。...能有这么好查找效率得益于自平衡特性,而这背后付出,插入操作功不可没~ 插入 插入操作包括两部分工作:一查找插入位置;二插入后自平衡。...理由很简单,红色父结点(如果存在)为黑色结点黑色平衡没被破坏,不需要做自平衡操作。但如果插入结点黑色,那么插入位置所在子树黑色结点总是多1,必须做自平衡。 所有插入情景如图7所示。...插入情景1:为空 最简单一种情景,直接把插入结点作为根结点就行,但注意,根据性质2:根节点黑色。还需要把插入结点设为黑色。 处理:把插入结点作为根结点,并把结点设置为黑色

1.2K62

【高阶数据结构】详解

相比之下,插入和删除操作需要旋转次数相对较少,因此插入和删除操作频繁情况下,可能更加高效。 这个如果大家学完这篇文章或许更好理解。...插入(仅仅是插入过程) 由于也是一种搜索二叉二叉搜索基础上加上其平衡限制条件来实现平衡。 所以插入逻辑也根搜索二叉一样: 那插入一下就完事了吗?...因为新节点默认颜色红色,因此: 如果其双亲节点颜色黑色,没有违反任何性质,则不需要调整; 但当新插入节点双亲节点颜色为红色,就违反了性质三不能有连续红色结点出现,此时需要对红分情况来讨论...如果g节点,调整完成后,需要将g改为黑色。 这样满足一棵。 那上面g根结点情况,那如果g一棵子树呢?...相对而言,对平衡控制比较宽松,降低了插入删除需要旋转次数,所以经常进行增删结构中性能比AVL更优,而且实现比较简单,所以实际运用中更多。

28510

傻瓜都能看懂,30张图彻底理解

阅读本文你需具备知识点: 二叉查找 完美平衡二叉 也是二叉查找,我们知道,二叉查找这一数据结构并不难,而之所以难它是自平衡二叉查找进行插入和删除等可能会破坏平衡操作...必须满足下面性质: 每个节点要么黑色,要么红色。 根节点黑色。 每个叶子节点(Nil)黑色。 每个红色结点两个子结点一定都是黑色。 任意一结点到每个叶子结点路径都包含数量相同结点。...前面讲到自平衡,是什么?有如下三种操作: 左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点父结点,右子结点左子结点变为旋转结点右子结点,左子结点保持不变。如图 3。...能有这么好查找效率得益于自平衡特性,而这背后付出,插入操作功不可没。 插入 插入操作包括两部分工作:一查找插入位置;二插入后自平衡。...理由很简单,红色父结点(如果存在)为黑色结点黑色平衡没被破坏,不需要做自平衡操作。 但如果插入结点黑色,那么插入位置所在子树黑色结点总是多 1,必须做自平衡。

34510

超详细模拟实现

前言 有人说设计出AVL的人个大牛,那写(RBTree)的人就是天才!...一种自平衡二叉查找性质比较复杂,但却非常重要,常用于C++中STL库中set、map等容器。节点有两种颜色:红色(red)和黑色(black)。...具有如下五个性质: 每个节点红色或者黑色。 根节点黑色。 每个叶子节点(这里特指最下面的空节点黑色。 如果一个节点红色,则节点必须黑色。...结点类中我们提到,创建节点我们给与了默认颜色为RED(红色),而节点必须BLACK(黑色,这里一定要记得修改一下颜色。...这里我将当前结点父亲(parent)兄弟称为叔叔结点。 示例: 当我们新增一个结点,默认新节点颜色为RED,如果父亲结点黑色,则不需要做任何调整,直接插入成功!

10611

001 (一)之 原理和算法详细介绍

因此,“一棵含有n个节点高度至多为2log(n+1)”。 基本操作(一) 左旋和右旋 基本操作添加、删除。在对红进行添加或删除之后,都会用到旋转方法。为什么呢?...我们清晰发现,它们对称。无论左旋还是右旋,被旋转旋转二叉查找,并且旋转之后仍然一颗二叉查找。 ?...那接下来,我们就来想方设法旋转以及重新着色,使这颗重新成为! 第二步:将插入节点着色为"红色"。 为什么着色成红色,而不是黑色呢?为什么呢?...第一步中,我们当作二叉查找,然后执行插入操作。而根据二叉查找数特点,插入操作不会改变根节点。所以,根节点仍然黑色。 对于"特性(3)",显然不会违背了。...x+节点,我们将x由“+节点 变成 “节点,多余一个“属性移到x节点中,即x节点多出了一个属性(若x节点原先是“”,则此时变成了“+”;若x节点原先

56530

算法之

但是一般情况下,执行添加、删除节点,AVL执行操作更多一些,效率更低一些;而且也是相对平衡二叉(从一个节点到该节点子孙节点所有路径上包含相同数目的节点)。...因此,右旋中“右”,意味着“被旋转节点将变成一个右节点”。 3.4 添加操作     向一颗含有n个节点插入一个节点,可以时间O(lgn)内完成。     将节点z插入T内。...需要执行操作依次:首先,将T当作一颗二叉,将z插入;然后,将z着色为红色;最后,通过RB-INSERT-FIXUP来对节点重新着色并旋转,以此来保证删除节点仍然一颗。...介绍为什么将则着色为红色之前,我们重新温习一下特性: (1)每个节点或者黑色,或者红色。 (2)根节点黑色。 (3)每个叶子节点(NIL)黑色。...情况二:被插入节点节点黑色。     什么也不需要做。节点插入后,仍然。 情况三:被插入节点节点红色。     那么,该情况与“特性(5)”相冲突。

97760

C++【

天才设计,那么 就是 天才中天才设计,不同于 AVL 极度自律, 条件符合时,才会进行 旋转降高度,因为旋转也是需要耗费时间 减少旋转次数整体性能上仍然没有落后...AVL 太多 先来一睹 样貌 注:极限场景下,与 AVL 性能差不超过 2 倍 1.1、定义 也是 三叉链 结构,不过没有 平衡因子,取而代之 颜色...如果一个节点 红色 ,那么两个孩子节点都不能 黑色 (不能出现连续节点) 对于每个节点,从该节点到其所有后代 NIF 节点简单路径上,都包含相同数目的黑色节点(每条路径上都有相同数目的... 插入操作,也需要借助 抽象图,此时 抽象图 不再代表高度,而是代表 黑色节点 数量 抽象图中关注 黑色节点 数量 2.2、插入流程 插入流程也和 二叉搜索 基本一致...逻辑与 AVL 一致,这里额外分享一个 DeBug 技巧: 当 随机插入 数据出错,可以借助文件读写操作,将出错数据保存下来,然后再次输入,反复进行调试,即可找出 Bug 因为 随机插入 出现问题

18510

深入理解

同样自平衡二叉搜索AVL,由于保持了严格均衡策略,导致插入和删除频繁,性能会下降比较厉害,而则是不强调严格均衡性,所以删除和插入时候,综合性能要高于AVL,但查询性能则略低于...性质 每个节点都带有颜色属性二叉查找,颜色为红色或黑色。...第二个问题为什么新加入节点必须红色,因为从性质5上来看,要保持相等黑色节点数量才能符合性质,如果插入节点默认黑色,那么一定会破坏性质,而红色则不一定,除非节点也是红色...平衡原理 不同于AVL每一个节点上维持了高度字段辅以旋转策略来维持平衡,插入和删除时候,维持平衡手段主要是:变色+旋转 (一)插入操作 树上进行插入操作和删除操作会导致不再匹配性质...情况一:只需要变色维持性质 考虑这样一种情况,新插入节点节点不是黑色节点,也不是root节点,并且叔叔节点红色,如下图: ?

1K30

【C++】从零开始构建

1 一种特殊二叉遵循一套独特规则: ⚠️每个节点要么红色,要么黑色。 ⚠️根节点必须黑色。 ⚠️如果一个节点红色,则两个子节点必须黑色。...应用场景十分广泛,其中之一很多高性能C++ STL库中被广泛采用,比如map和set。...之后我们将来实现map与set封装!!! 平衡性质使其在数据库系统中也得到了广泛应用,特别是实现索引结构。...这个最为关键规则,插入一个黑色节点树立刻就不是了!!!...有可能违反: 如果父节点黑色插入一个红色节点刚刚好,没有破坏规则!!! 如果父节点红色,插入一个红色节点就违反了规则3。

8100

【C++】手撕

但如果认真阅读了这篇博客,并且你有 AVL 基础的话 (重点 AVL 旋转),其实你会发现,难只是指比较抽象,但它逻辑其实是比 AVL 要简单,并且代码也不难写。...性质 有如下性质: 每个结点不是红色就是黑色; 根节点黑色; 如果一个节点红色,则两个孩子结点黑色 – 不允许出现连续红色节点; 对于每个结点,从该结点到其所有后代叶结点简单路径上...---- 三、插入 插入前面部分很简单,就是一般二叉搜索插入逻辑,需要注意如果插入节点节点,则我们需要将节点颜色改为黑色,因为新增节点默认被初始化为红色插入难点在于检测插入性质是否被破坏...旋转 – 和 AVL 一样,会根据父节点位置不同和插入节点位置不同选择不同旋转方式来进行调整,旋转一共分为四类: 右单旋 – 父节点在祖父节点左侧,cur 节点左侧; 左单旋...O(logN) 这个量级; 不过也正是由于不要求左右子树绝对平衡,所以相较于 AVL 插入和删除旋转次数要少一些,所以经常进行增删结构中性能比 AVL 更优,而且实现比较简单

36440

70 张图带你彻底掌握!

④ 继续添加节点 18 ,自己脑补下该怎么添加?...2-3 时间复杂度Ologn,实际上就是由 2-3 推导出来,2-3 关系:2-3 插入和删除过程也可以对应到旋转与颜色变换过程(至于旋转和变色中会重点讨论...6、 上面为什么不常见 2-3 说了那么多?因为 2-3插入和删除过程也可以对应到旋转与颜色变换过程。下面我们先来了解下什么叫 # 定义(特性) 1....如果新插入节点黑色】,那不管插入到那里,一定会破坏黑色完美平衡,因为任意一个节点路径到叶子节点黑色节点数量肯定不一样了(第 6 点我自己加,实际特性定义前 5 个) 最大高度...因为这个本来就是黑色完美平衡了,再新插入一个新节点红色节点,并不会破坏平衡以及特性(不要去研究为什么

56030

树结构系列(二):平衡二叉、AVL

与 AVL 相比,其通过牺牲查询效率来提升插入、删除效率。 二叉查找基础上演化进来,除了二叉查找要求之外,还具有如下五个强制要求(属性): 性质 1. 结点红色或黑色。...根据性质 5 所有最长路径都有相同数目的黑色结点,这就表明了没有路径多于任何其他路径两倍长。 当我们在对红进行插入和删除等操作,对做了修改,那么可能会违背性质。...为了保持性质,我们可以对相关结点做一系列调整,通过对进行旋转(例如左旋和右旋操作),即修改中某些结点颜色及指针结构,以达到对红进行插入、删除结点等操作依然保持特有的五个性质...性质 1 规定节点颜色要么红色要么黑色,那么插入节点,这个节点应该是红色还是黑色呢? 答案红色,原因也不难理解。...其通过牺牲部分查询效率,提升了插入、删除效率,使其最坏情况下也实现 O (log N) 时间复杂度。接着我们深入介绍了旋转操纵,揭示了如何实现平衡操作

91120

【C++修炼之路】20.手撕

1.2 性质 每个结点不是红色就是黑色节点黑色 如果一个节点红色,则两个孩子结点黑色 对于每个结点,从该结点到其所有后代叶结点简单路径上,均包含相同数目的黑色结点 每个叶子结点都是黑色...思考: 为什么满足上面的性质,就能保证:其最长路径中节点个数不会超过最短路径节点个数两倍? 就上面的这颗来说,有11条路径(需算到空)我们观察黑色结点,发现是接近满二叉。...虽不如AVL极度平衡,但明显插入节点显得张弛有力。对于AVL来说,说是过刚易折也不为过,往往像那样增加一定柔韧性,才是最后选择。...即: 如果一个节点红色,则两个孩子结点黑色 对于每个结点,从该结点到其所有后代叶结点简单路径上,均包含相同数目的黑色结点 如果我们新插入结点颜色为的话,插入之后一定会打破上述第二个结构...插入节点颜色必须为 ---- 检测新节点插入后,性质是否造到破坏 因为新节点默认颜色红色,因此:如果其双亲节点颜色黑色,没有违反任何性质,则不需要调整;但当新插入节点双亲节点颜色为红色

33100

对于旋转保持不变只有原搜索性质,而原性质则不能保持,数据插入和删除后可利用旋转和颜色重涂来恢复性质。...第一步中,我们当作二叉查找,然后执行插入操作。而根据二叉查找数特点,插入操作不会改变根节点。所以,根节点仍然黑色。 ​ 对于"特性(3)",显然不会违背了。...这种情况下,被插入节点一定存在非空祖父节点;进一步讲,被插入节点也一定存在叔叔节点(即使叔叔节点为空,我们也视之为存在,空节点本身就是黑色节点)。...但是当叔叔节点黑色,则要考虑节点左孩子还是右孩子。 ? case2很简单,通过旋转生成右边图,而右边情况就是case3。 总之case2就是通过一次旋转,然后进行case3判断 3....少量旋转操作使得再添加节点,大部分节点可以被查询/修改(因为旋转为了数据安全,会锁住某些节点不能被修改,而着色操作并不影响这些)。很多底层实现上,有大量实现。

74340

最通俗易懂入门(R-B Tree)

+旋转来进行调整 情况一:插入之后不破坏规则,不需要旋转,也不需要变色: 我们来看下面这种情况 当我们插入值为【66】节点变成了这样 ?...可以看到插入之后特性并未被破坏原特性。 那么不妨考虑一下为什么????...其实也不难,第一种情况插入红色,爸爸黑色,不破坏黑色节点也没有连续红色,所以不用操作;第二种插入红色,爸爸红色,而且叔叔也是红色,所以爸爸和它叔叔会一起变色,爷爷会随之变色,所以能够达到同一层红色统一变黑色...若新插入节点爸爸黑色节点不需要调整 3. 若新插入节点爸爸和它叔叔都是红色节点只需要变色,不需要旋转 4....若新插入节点爸爸红色,但是叔叔黑色(可能为null,但是null叶子节点,正儿八经黑色),这时,一定是变色+旋转

7.7K65

面试还在被-虐?看完这篇动图文章轻松反虐面试官

-特征 主要有两个特征: 1.节点都有颜色;2.插入和删除过程中,要遵循保持这些颜色不同排列规则。...-插入节点都是红色,这不是偶然,因为插入一个红色节点插入一个黑色节点违背-规则可能性更小。...3.1 -节点 -对二叉搜索改进,所以其节点与二叉搜索差不多,只不过基础上增加了一个boolean型变量来表示节点颜色,具体看RBNode类: public class...如果第一次插入,由于原为空,所以只会违反-规则2,所以只要把根节点涂黑即可;如果插入节点节点黑色,那不会违背-规则,什么也不需要做;但是遇到如下三种情况,我们就要开始变色和旋转了...于情况3:插入节点节点红色,叔叔节点黑色,且插入节点其父节点左子节点。我们要做操作有:将当前节点节点(7)涂黑,将祖父节点(11)涂祖父节点为支点做右旋操作。

5.2K43
领券