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

C++:红黑树

如何确保最长路径不超过最短路径的2倍 根据颜色规则可知,在一棵红黑树中,设从根到叶子的每条路径都有 x 个黑色节点,那么最短路径就是全黑,长度为x,最长路径是一黑一红交替,长度为 2 * x。...事实上,最长路径和最短路径在每棵红黑树中不一定存在,任意一条从根到叶子的路径长度 l 的范围应该是x 红黑树的效率 假设N为红黑树中节点数量,h是最短路径长度,既有 2 ^ h - 1 红黑树的插入是实现红黑树最关键的一步,具体过程如下: 插入一个值按照二叉搜索树插入,插入后判断是否符合红黑树的4条规则 非空树的插入,插入的节点必须是红色节点,因为插入黑色节点破坏规则4,规则4很难维护..._root->_col = BLACK; return true; } ​ 代码解释: 向红黑树中插入一个key-value,如果是空树插入,则直接根据kv来new一个节点,然后赋值给_root,记得将根节点的颜色置为黑

4700

【C++】红黑树

今日更新了红黑树的相关内容 欢迎大家关注点赞收藏⭐️留言 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。...最长路径红一黑间隔,最短路径就是全黑) 节点的定义 红黑树的插入操作 红黑树是在二叉搜索树的基础上加上其平衡限制条件,因此红黑树的插入可分为两步: 按照二叉搜索的树规则插入新节点..._root->_col = BLACK; return true; } 红黑树的验证 红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质...AVL树的比较 红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(logN),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数, 所以在经常进行增删的结构中性能比...AVL树更优,而且红黑树实现比较简单,所以实际运用中红 黑树更多。

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

    C++【红黑树】

    ---- 前言 红黑树是平衡二叉搜索树中的一种,红黑树性能优异,广泛用于实践中,比如 Linux 内核中的 CFS 调度器就用到了红黑树,由此可见红黑树的重要性。...,这里不再展开叙述,可以复用 AVL 中的旋转代码,并且最后不需要调整平衡因子 《C++【AVL树】》 注意: 红黑树的调整可以分为 右半区 和 左半区 两个方向(根据 grandfather 与 parent...详细操作可以参考这篇 Blog:《红黑树(C++实现)》 ---- 3、AVL树 VS 红黑树 AVL 树 和 红黑树 是 平衡二叉搜索树 的两种优秀解决方案,既然两者功能一致,那么它们的实际表现如何呢...的价值,还好这次测试,红黑 比 AVL 强 红黑树还是有实力的 红黑树 是 set 和 map 的底层数据结构,在下篇文章中,将会进一步完善 红黑树,并用我们自己写的 红黑树 封装 set / map...,最后可以和库中的切磋一下~ 本文中涉及的源码:《RBTree 博客》 ---- 总结 以上就是本次关于 C++【红黑树】的全部内容了,在本文中,我们首先了解了什么是 红黑树,然后对其进行了实现,作为数据结构中的大哥

    22110

    C++: 红黑树

    红黑树的概念 红黑树, 是一种二叉搜索树, 但在每个节点上增加一个存储位表示节点的颜色, 可以是Red或者Black....满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍 3....红黑树的验证 红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 bool IsBalance() { if (_root == nullptr...红黑树与AVL树的比较 红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O( log_2 N ),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数...,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。

    8210

    C++红黑树

    C++红黑树 零、前言 一、红黑树的概念及性质 二、红黑树结点的定义 三、红黑树的插入操作 1、变色处理 2、单旋+变色 3、双旋+变色 4、插入实现 四、红黑树的验证 五、红黑树的删除 六、红黑树与*...*AVL**树的比较 零、前言 本章继AVL树后继续讲解学习C++中另一个二叉搜索树–红黑树 一、红黑树的概念及性质 概念: 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色...,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 每个NIL结点都是黑色的(此处的结点指的是空结点)(该条规则确定了路径条数) 为什么红黑树就能保证其最长路径中节点个数不会超过最短路径节点个数的两倍...: 如果默认颜色为黑,那么在插入中插入一个黑结点一定会让该路径上的黑结点数量加1,从而与其他路径上黑结点数量造成不一致,而一定会影响该棵红黑树 如果默认颜色为红,那么在插入中插入一个红结点,...红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 实现代码: bool IsRBTree() { //空树 if

    41610

    【C++】红黑树

    个人主页 : zxctscl 如有转载请先通知 AVL树是严格平衡因子,红黑树是近似平衡。 1....红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...红黑树结构 为了后续实现关联式容器简单,红黑树的实现中增加一个头结点,因为跟节点必须为黑色,为了与根节点进行区分,将头结点给成黑色,并且让头结点的 pParent 域指向红黑树的根节点,pLeft域指向红黑树中最小的节点...红黑树的插入 那么插入一个新节点是什么颜色比较好?...红黑树的验证 红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 遍历遇到红色节点检查父亲是不是红色 每个节点记录一个值:根到当前节点路径中黑色节点的数量

    5300

    C++:红黑树

    在定义当中,构造函数初始化列表对颜色_col默认初始化为红色是因为权衡了上面所述红黑树性质中的性质3和性质4。 性质3是说明了红黑树没有连续的红色节点,性质4说明的是每条路径都有相同数量的黑色节点。...红黑树的旋转直接复用AVL树的旋转的代码即可。 验证红黑树 红黑树的验证分两步:①通过中序遍历验证其是否满足二叉搜索树的性质。②验证是否满足红黑树的性质。...④在验证③的过程中,如果发现当前节点与父节点都是红色的,直接false。这一步是验证红黑树的性质之一:不能出现连续的红色节点。...所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。...也就是因为红黑树在修改操作方面的性能比AVL树好,因此红黑树都用在了C++的STL库(map/set、mutil_map/mutil_set),Java库、Linux内核等等地方。

    25120

    【C++】————红黑树

    1.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的 2.红黑树的性质 关于红黑树,都有什么性质呢?下面我们来一一列举。...4.红黑树的插入操作 我们在进行插入操作时,新节点默认是红色。红色节点的插入可能导致红黑树的性质被破坏,但通过将新节点设为红色,我们可以更容易地通过颜色变换和旋转来恢复平衡。...因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何 性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连 在一起的红色节点,此时需要对红黑树分情况来讨论...: 约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点 情况一: cur为红,p为红,g为黑,u存在且为红 情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑 p为g的左孩子,

    6610

    【c++】红黑树

    目录 1.红黑树的介绍与性质 2.节点定义 3.红黑树的插入: 情况一:父节点与叔节点均为红 情况二:父节点为红,叔节点为黑或者不存在 情况三:父节点为红,叔节点为黑或者不存在(双旋) 代码实现 4.红黑树的验证...1.红黑树的介绍与性质 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...插入红色节点不会立即违反这个性质,因为它不影响通过它的路径的黑色节点数量 所以在节点的定义中,将节点的默认颜色给成红色的 3.红黑树的插入: template class...,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连在一起的红色节点,此时需要对红黑树分情况来讨论 情况一:父节点与叔节点均为红 cur为红,p为红,g为黑,u存在且为红 cur...如果左子树或右子树有一个不满足红黑树性质,则整个函数返回false 最终,IsBalance将返回一个布尔值,表示树是否满足红黑树的性质。

    8900

    【C++】RBTree——红黑树

    一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的 。...(既最长路径长度不超过最短路径长度的 2 倍) ps:树的路径是从根节点走到空节点(此处为NIL 节点)才算一条路径 二、红黑树的性质 每个结点不是红色就是黑色 根结点是黑色的 如果一个结点是红色的...所以如果插入为红色结点,不一定会破坏结构,但是如果插入黑色结点我们就必须去进行维护了 ---- 四、红黑树的插入 红黑树插入的操作部分和AVL树的插入一样: 找到待插入位置 将待插入结点插入到树中...调整:若插入结点的父结点是红色的,我们就需要对红黑树进行调整 前两步大差不差 因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时

    20520

    初识C++ · 红黑树

    前言: 红黑树,二叉搜索树的一种,基于红黑树实现的结构有map 和 set,红黑树是一种近似平衡的结构,也就是没有把高度卡的特别死。...在这个部分呢着重介绍于插入部分的调整以及判断整个树是否满足红黑树的条件,其他函数和AVL树部分基本上没有啥差别。 现在就进入插入部分。...1 插入部分 插入之前,我们不妨先了解红黑树的节点构成,红黑树,有颜色,所以我们需要用变量来表示颜色,这里采用的是使用枚举,定义RED 和 BLACK表示颜色,同样的,红黑树也要使用三叉链结构,在调整的时候...那么红黑树的四条规则,我们插入节点影响的就是第三条规则和第四条规则,所以现在要看的就是第三条规则和第四条规则谁更凶一点。...,相对于AVL树来说,红黑树要简单一点,这里可以多对比一下。

    6510

    【C++进阶】红黑树

    什么是红黑树? 红黑树 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,用于保持树的平衡,以确保在最坏情况下基本操作(如插入、删除和查找)的时间复杂度仍为 O(log n)。...红黑树的每个节点都包含一个额外的颜色位,即红色或黑色。红黑树通过严格的平衡条件来维持树的平衡。 红黑树的性质 节点是红色或黑色的:每个节点都有颜色属性,红色或黑色。...根是黑色的:红黑树的根节点必须是黑色的。 叶节点(NIL 节点)是黑色的:红黑树中的所有叶节点(这里的叶节点是指为空的 NIL 节点,而不是实际的元素节点)都是黑色的。...insert 红黑树的逻辑是在普通的二叉搜索树上进行实现的,在普通的二叉搜索树中,我们不需要调节平衡,但是在红黑树当中我们需要根据红黑树的性质来调整数的颜色和高度,首先我们来看看第一种情况:...希望通过本篇博客,大家能够对红黑树有更加深入的认识,并在实际编程中灵活应用。

    14110

    C++之红黑树

    动态演示: 升序: 降序: 随机插入构建红黑树: 右旋转: 左旋转: 六、验证红黑树 验证红黑树分为两步: 1.检测是否满足二叉搜索树 中序遍历是否为有序序列...2.检测是否满足红黑树性质 代码如下: bool IsValidRBTree()//验证是否为红黑树 { Node* pRoot = GetRoot(); // 空树也是红黑树...AVL树的比较 红黑树和AVL树都是高效的平衡二叉树,增删查改的时间复杂度都是O( log_2 N ),红黑树不追求绝对平衡,只要保证最长路径不超过最短路径的两倍。...相对而言,插入和旋转的次数更少,在经常进行增删的结构中性能比AVL树更优,而且红黑树的实现比AVL树简单,因此更加常用。 总结 以上就是今天要讲的内容,本文介绍了C++中红黑树的相关概念。...本文作者目前也是正在学习C++相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

    47530

    【C++】模拟实现红黑树

    一.了解项目功能 在本次项目中我们的目标是实现一个红黑树类模板,还不了解红黑树概念的朋友可以先移步[【数据结构】什么是红黑树(Red Black Tree)?]...(RBTreeNode)逻辑结构图示如下: 红黑树类模板提供的功能有: 红黑树结点类的构造函数 红黑树的构造函数 红黑树的插入函数 左单旋函数 右单旋函数 判断红黑树是否符合红黑树规则函数...RBTreeNode的构造函数我们实现两个即可,一个是有参构造,一个是无参构造,而无参构造又可以通过给缺省值的方式和有参构造合二为一,所以我们用初始化列表来实现一下RBTreeNode的构造函数(我在红黑树的概念中已经分析过为什么新插入的结点一定是红色...= parent->_parent; //因为我们在红黑树中不用平衡因子但是要判断是LL/RR/LR/RL型的旋转,因此需要在这里分情况讨论 if (parent == grandfather...判断一棵树是不是红黑树,就要从红黑树的几个规则出发,看其是否满足下面这几个规则: 每个结点不是红色就是黑色 根结点是黑色 如果一个结点是红色的,则它的子结点一定是黑色 任一结点到NULL

    8210

    手写红黑树(C++实现)

    手写红黑树(C++实现)在计算机科学中,红黑树(Red-Black tree)是一种自平衡的二叉搜索树,它是在B树的基础上添加了颜色标记,用以保证其在插入和删除等操作后能够保持平衡。...本文将带你一步步实现红黑树的基本功能,包括插入、删除和搜索等操作。我们使用C++语言来实现红黑树的数据结构和算法。...然后,根据红黑树的性质对树进行修复,以保持红黑树的平衡。 在删除操作中,我们需要处理以下情况:当删除节点是红色节点时,直接删除,不会影响红黑树的平衡。...红黑树的实现还有很多变种和优化,涉及更多的特殊情况处理和平衡性维护。但是通过了解这个基本的实现流程,你应该可以更好地理解红黑树的原理和特性,并能够自己实现一个简单的红黑树。...通过手写实现红黑树,我们不仅能够更深入地理解红黑树的原理和操作,还能够提升自己的编程能力。

    34110

    【C++】红黑树 --- mapset 底层

    很简单,假设每条路径的黑色节点数量为 h 个,那么 h 红黑树中任意一条路径长度 黑一红间隔; 如下图...,左边是这颗红黑树的最短路径,高度为 2;最右边是这颗红黑树的最长路径,高度为 4;这颗红黑树中符合上面的所有规则,所以最短路径没有超过最长路径的两倍,所以这颗树符合红黑树的规则。...3.2: 此时这种情况相当于AVL树中双旋的情况,cur 到 g 是折线的形式,在红黑树中这种情况确实也是需要进行双旋,下面只画出情况3.1的旋转过程和变色,情况3.2也是类似的;旋转过程是先对 p 进行左单旋...红黑树的验证 红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 首先我们验证是否满足二叉搜索树,代码如下: // 判断中序遍历是否为有序序列...++()与operator–() 迭代器最重要的部分就是在 ++ 和 - - 的实现上;先说 ++it 的核心,因为我们是要按照中序的顺序遍历红黑树,所以 ++it 最核心的就是找中序的下一个,此时分为两种情况

    21310

    【C++】AVL树和红黑树的插入

    在实际应用中,AVL树用的很少,反而红黑树却名声在外,声明远扬,被用的最多。...红黑树有5条重要的性质,但最有用的就是其中的第c和d条。 a.红黑树的节点不是红色就是黑色 b.红黑树的根节点必须是黑色 c.红黑树从当前根节点到每条路径上的黑色节点数量都相同。...所以红黑树的搜索效率和AVL树可以近似看作相等,但是红黑树不需要那么多的旋转来调平衡,因为红黑树可以允许最长路径是最短路径的2倍,他的要求并没有AVL树那么严格,所以红黑树的旋转次数要比AVL树少很多,...效率自然就提升了,故而实际应用中红黑树要比AVL树用的更多一些。...红黑树的验证相比AVL树就复杂的多了,我们需要对红黑树的三个部分进行验证,首先利用中序遍历观察是否满足搜索树,还需要验证红黑树中不能出现连续的红色结点,最后还需要保证每条路径的黑色结点数量都相同。

    66820

    【C++】从零开始构建红黑树

    红黑树的应用场景十分广泛,其中之一是在很多高性能的C++ STL库中被广泛采用,比如map和set。...红黑树的平衡性质使其在数据库系统中也得到了广泛的应用,特别是在实现索引结构时。在数据库系统中,红黑树可以用于实现基于范围的查询,如在B+树的实现中,通常使用红黑树来维护叶子节点的有序性。...2 红黑树的模拟实现 ✅了解了红黑树的定义与规则,接下来我们就来实现红黑树✅ 2.1 ❤️红黑树的节点设计 红黑树的节点设计基于二叉搜索树的节点增加了一个表示颜色的变量,用来标识该节点的颜色; //枚举变量来定义颜色...2.2 ❤️红黑树的插入函数 整体框架 现在我们来进行红黑树核心函数的实现,在这个插入函数中,会深刻体会到红黑树的抽象程度,也会大大加强代码能力!!!...这个是红黑树最为关键的规则,插入一个黑色节点,红黑树立刻就不是红黑树了!!!

    13200

    【C++】二叉搜索树+变身 = 红黑树

    本篇文章不会带你从头到尾实现红黑树,但会带你深入理解红黑树是怎么实现平衡的,怎么通过旋转变换实现保持平衡,以及实现平衡过程中的细节应该怎么处理等。...另外红黑树主要还是以黑色节点为主,在红黑树中黑色节点通常都是通过变色而来的,而红色节点往往都是新增的。 三、新增节点插入 虽然新增节点默认为红色,但根节点必须是黑色。...四、验证红黑树 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 检测红黑树的性质,主要检测红黑树的根节点是否为黑色、任意一个红色节点的父节点不是红色、任意节点到根节点的路径上黑色节点的数量相等...红黑树: 平衡机制基于颜色和一系列规则(如节点颜色、红色节点的子节点颜色、路径上黑色节点数量等) 允许节点之间的高度差超过1,但通过保证从根节点到叶节点的任意路径上黑色节点的数量相同来避免树的高度过大...1 在插入或删除节点时,可能需要通过多次旋转操作来维持平衡,并更新每个节点的平衡因子 红黑树相对AVL树并没有那么严格地要求平衡,仅通过颜色控制最长路径中节点个数不会超过最短路径节点个数的两倍就行

    9610
    领券