---- 前言 红黑树是平衡二叉搜索树中的一种,红黑树性能优异,广泛用于实践中,比如 Linux 内核中的 CFS 调度器就用到了红黑树,由此可见红黑树的重要性。...,这里不再展开叙述,可以复用 AVL 中的旋转代码,并且最后不需要调整平衡因子 《C++【AVL树】》 注意: 红黑树的调整可以分为 右半区 和 左半区 两个方向(根据 grandfather 与 parent...左单旋 右左,右左双旋 左半区 左左,右单旋 左右,左右双旋 得益于前面 AVL 树旋转操作的学习,红黑树 这里在编写 旋转 相关代码时,没什么大问题 红黑树 的 DeBug 逻辑与 AVL 树一致,...详细操作可以参考这篇 Blog:《红黑树(C++实现)》 ---- 3、AVL树 VS 红黑树 AVL 树 和 红黑树 是 平衡二叉搜索树 的两种优秀解决方案,既然两者功能一致,那么它们的实际表现如何呢...,最后可以和库中的切磋一下~ 本文中涉及的源码:《RBTree 博客》 ---- 总结 以上就是本次关于 C++【红黑树】的全部内容了,在本文中,我们首先了解了什么是 红黑树,然后对其进行了实现,作为数据结构中的大哥
红黑树的概念 红黑树, 是一种二叉搜索树, 但在每个节点上增加一个存储位表示节点的颜色, 可以是Red或者Black....,以维持红黑树的性质....红黑树的验证 红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 bool IsBalance() { if (_root == nullptr...红黑树与AVL树的比较 红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O( log_2 N ),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数...,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。
C++红黑树 零、前言 一、红黑树的概念及性质 二、红黑树结点的定义 三、红黑树的插入操作 1、变色处理 2、单旋+变色 3、双旋+变色 4、插入实现 四、红黑树的验证 五、红黑树的删除 六、红黑树与*...*AVL**树的比较 零、前言 本章继AVL树后继续讲解学习C++中另一个二叉搜索树–红黑树 一、红黑树的概念及性质 概念: 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色...: 红黑树第三条性质说明红黑树不能存在连续(父子相连)的红结点,可以存在连续的黑结点,又由于第四条性质每个路径上的黑结点个数都相同 ,所以对于最短路径来说一定是都是黑色结点,对于最长路径来说一定是黑色红色相间的路径...,所以最长路径不超过最短路径长度的二倍 示图: 二、红黑树结点的定义 对于红黑树来说以颜色来代替AVL树的平衡因子的作用,除此之外在定义上没有什么区别 实现代码: enum Colour//...红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质 实现代码: bool IsRBTree() { //空树 if
今日更新了红黑树的相关内容 欢迎大家关注点赞收藏⭐️留言 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。...最长路径<=最短路径*2 (最长路径就是一红一黑间隔,最短路径就是全黑) 节点的定义 红黑树的插入操作 红黑树是在二叉搜索树的基础上加上其平衡限制条件,因此红黑树的插入可分为两步: 按照二叉搜索的树规则插入新节点..._root->_col = BLACK; return true; } 红黑树的验证 红黑树的检测分为两步: 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 检测其是否满足红黑树的性质...AVL树的比较 红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(logN),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数, 所以在经常进行增删的结构中性能比...AVL树更优,而且红黑树实现比较简单,所以实际运用中红 黑树更多。
1.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的 2.红黑树的性质 关于红黑树,都有什么性质呢?下面我们来一一列举。...4.红黑树的插入操作 我们在进行插入操作时,新节点默认是红色。红色节点的插入可能导致红黑树的性质被破坏,但通过将新节点设为红色,我们可以更容易地通过颜色变换和旋转来恢复平衡。...因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何 性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连 在一起的红色节点,此时需要对红黑树分情况来讨论...: 约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点 情况一: cur为红,p为红,g为黑,u存在且为红 情况二: cur为红,p为红,g为黑,u不存在/u存在且为黑 p为g的左孩子,
红黑树的概念 红黑树是一棵二叉搜索树,但是红黑树通过增加一个存储位表示结点的颜色RED或BLACK。...从性质上分析红黑树的近似平衡 一颗红黑树最短的路径是这条路径全黑。最长是一红一黑相间路径。 对于近似平衡来说: ①最优情况就是左右平衡,此时每条路径都是全黑或者是一红一黑相间,形成满二叉树。...红黑树节点的定义 红黑树节点的定义,跟AVL树的区别就是红黑树不需要平衡因子,而加入了颜色红跟黑。...红黑树的旋转直接复用AVL树的旋转的代码即可。 验证红黑树 红黑树的验证分两步:①通过中序遍历验证其是否满足二叉搜索树的性质。②验证是否满足红黑树的性质。...也就是因为红黑树在修改操作方面的性能比AVL树好,因此红黑树都用在了C++的STL库(map/set、mutil_map/mutil_set),Java库、Linux内核等等地方。
目录 1.红黑树的介绍与性质 2.节点定义 3.红黑树的插入: 情况一:父节点与叔节点均为红 情况二:父节点为红,叔节点为黑或者不存在 情况三:父节点为红,叔节点为黑或者不存在(双旋) 代码实现 4.红黑树的验证...1.红黑树的介绍与性质 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...,则不需要调整;但当新插入节点的双亲节点颜色为红色时,就违反了性质三不能有连在一起的红色节点,此时需要对红黑树分情况来讨论 情况一:父节点与叔节点均为红 cur为红,p为红,g为黑,u存在且为红 cur...c有四种情况,cur原来为空,子树为两个红,新增有四个位置插入 情况三:父节点为红,叔节点为黑或者不存在(双旋) p为g的左孩子,cur为p的右孩子,则针对p做左单旋转;相反,p为g的右孩子,cur...如果左子树或右子树有一个不满足红黑树性质,则整个函数返回false 最终,IsBalance将返回一个布尔值,表示树是否满足红黑树的性质。
这一篇文章就来看看如何构建红黑树 对于平衡二叉树的构建,可以参考小程序中的文章(C++版)。...平衡二叉树 红黑树 红黑树属于平衡二叉树,但是并非严格意义上的平衡二叉树,因为平衡二叉树要求节点的左右子树高度差不超过1, 而红黑树放弃了这种高度平衡,利用对结点上色的操作来保证树相对平衡,这其中原因大概是维护一个绝对平衡的二叉树代价太大...但如果插入频率小或者只有一次构建,那么平衡二叉树的查询性能还是比红黑树高。...此时红黑树构建平衡分为4种情况: 情况一:红黑树为空树,此时插入结点充当根结点,上色为黑 情况二:插入结点已经存在,此时替换插入结点值即可 情况三:插入结点的位置,其父结点是黑色,此时平衡未打破,插入完成...到这里就构建完成了 相对于构建新增,红黑树的删除情况更为复杂,由于时间关系(这周只有一天休息加上绘图太费劲),留到下一次分享。 构建代码 红黑树构建源码
前言: 红黑树,二叉搜索树的一种,基于红黑树实现的结构有map 和 set,红黑树是一种近似平衡的结构,也就是没有把高度卡的特别死。...在这个部分呢着重介绍于插入部分的调整以及判断整个树是否满足红黑树的条件,其他函数和AVL树部分基本上没有啥差别。 现在就进入插入部分。...1 插入部分 插入之前,我们不妨先了解红黑树的节点构成,红黑树,有颜色,所以我们需要用变量来表示颜色,这里采用的是使用枚举,定义RED 和 BLACK表示颜色,同样的,红黑树也要使用三叉链结构,在调整的时候...那么红黑树的四条规则,我们插入节点影响的就是第三条规则和第四条规则,所以现在要看的就是第三条规则和第四条规则谁更凶一点。...,相对于AVL树来说,红黑树要简单一点,这里可以多对比一下。
什么是红黑树? 红黑树 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,用于保持树的平衡,以确保在最坏情况下基本操作(如插入、删除和查找)的时间复杂度仍为 O(log n)。...红黑树的每个节点都包含一个额外的颜色位,即红色或黑色。红黑树通过严格的平衡条件来维持树的平衡。 红黑树的性质 节点是红色或黑色的:每个节点都有颜色属性,红色或黑色。...根是黑色的:红黑树的根节点必须是黑色的。 叶节点(NIL 节点)是黑色的:红黑树中的所有叶节点(这里的叶节点是指为空的 NIL 节点,而不是实际的元素节点)都是黑色的。...insert 红黑树的逻辑是在普通的二叉搜索树上进行实现的,在普通的二叉搜索树中,我们不需要调节平衡,但是在红黑树当中我们需要根据红黑树的性质来调整数的颜色和高度,首先我们来看看第一种情况:...其特有的平衡机制使得红黑树在实际应用中被广泛采用,尤其在需要频繁增删节点的数据结构中表现出色。掌握红黑树的原理和操作,不仅有助于理解复杂数据结构的实现,也为开发高效算法奠定了坚实基础。
四、红黑树的结构 五、插入操作 1.插入代码 bool insert(const pair& kv) { Node* newnode = new RBnode(kv)...情况一:c为红色,p为红,g为黑,u存在且为红 只需要将p和u的颜色置为黑色,g的颜色置为红色。...动态演示: 升序: 降序: 随机插入构建红黑树: 右旋转: 左旋转: 六、验证红黑树 验证红黑树分为两步: 1.检测是否满足二叉搜索树 中序遍历是否为有序序列...2.检测是否满足红黑树性质 代码如下: bool IsValidRBTree()//验证是否为红黑树 { Node* pRoot = GetRoot(); // 空树也是红黑树...相对而言,插入和旋转的次数更少,在经常进行增删的结构中性能比AVL树更优,而且红黑树的实现比AVL树简单,因此更加常用。 总结 以上就是今天要讲的内容,本文介绍了C++中红黑树的相关概念。
import java.util.NoSuchElementException; public class RedBlackTree<AnyType exte...
一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的 。...(既最长路径长度不超过最短路径长度的 2 倍) ps:树的路径是从根节点走到空节点(此处为NIL 节点)才算一条路径 二、红黑树的性质 每个结点不是红色就是黑色 根结点是黑色的 如果一个结点是红色的...所以如果插入为红色结点,不一定会破坏结构,但是如果插入黑色结点我们就必须去进行维护了 ---- 四、红黑树的插入 红黑树插入的操作部分和AVL树的插入一样: 找到待插入位置 将待插入结点插入到树中...调整:若插入结点的父结点是红色的,我们就需要对红黑树进行调整 前两步大差不差 因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何性质,则不需要调整;但当新插入节点的双亲节点颜色为红色时
1 代码实现的内容代码实现了从0构建一颗红黑树,可参考上文的例子红黑树插入的四种情况分析 - 腾讯云开发者社区-腾讯云 (tencent.com)2 代码public class RBTree {...boolean fatherNodeIsLeft = isLeftNode(currentNode.father); String condition = ""; //判断当前节点的树的形状...uncleNode.color.equals(REDCOLOR)) { //如果是非根节点需要把转换的树的父节点挂接好 if (preGreadGrandFatherNode...uncleNode.color.equals(REDCOLOR)) { //如果是非根节点需要把转换的树的父节点挂接好 if (preGreadGrandFatherNode
红黑树概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。...红黑树的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的,树中没有连续的红节点 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点...插入 红黑树的叔叔是关键 u存在且为红,变色继续向上处理 u不存在或存在且为黑,旋转(单旋+双旋)+变色 情况一:cur为红,parent为红,grandfather为黑(固定),uncle存在且为红...u不存在 u存在且为黑 情况三:cur为红,parent为红,grandfather为黑(固定),u不存在/u存在且为黑(双旋+变色) u不存在 u存在且为黑 插入代码: bool insert
,因此就出现了很多自平衡的二叉查找树,这些自平衡二叉查找树的查询效率都会稳定在O(logN),红黑树就是一种自平衡的二叉查找树。...下面我们会红黑树的特征、插入以及删除来分析红黑树是如何进行自平衡的。...特征 想要了解红黑树如何自平衡,就必须了解红黑树的特征,因为自平衡操作都是围绕这些特征来的,一旦一个红黑树因为插入和删除节点打破了自身的特征,那么他就需要进行自平衡(变色、旋转)来使得二叉树重新满足红黑树的特征...通过上述特征,决定了红黑树的一个重要特性:从根到叶子的最长的可能路径不多于最短路径的两倍长。 下图是一张红黑树示意图: ?...,需要我们细细揣摩,并且反复的研究,在了解红黑树的基本概念以后,我们后续会分析一下HashMap中红黑树的实现以及着手自己实现一个红黑树。
前言 红黑树的应用还是比较广泛的。比如Java8的HashMap的底层就用到了红黑树,还有TreeMap和TreeSet也用到了。 下面主要以下几个方面学习一下红黑树。...1)二叉查找树BST 2)红黑树RBTree的规则、增删查 3)红黑树的Java实现。...其中两款具有代表性的平衡树分别为AVL树和红黑树。AVL树由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如红黑树。...下图中这棵树,就是一颗典型的红黑树: ? 什么情况下会破坏红黑树的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子: 添加节点 1.向原红黑树插入值为14的新节点: ?...请参考BST的查找操作代码。 关于红黑树自平衡的调整,插入和删除节点的时候都涉及到很多种Case,由于篇幅原因无法展开来一一列举,有兴趣的朋友可以参考维基百科,里面讲的非常清晰。
历史上AVL树流行的另一变种是红黑树(red black tree)。...这种情形只有X和P是红的,G是黑的,因为否则就会在插入前有两个相连的红色节点,违反了红黑树的法则。采用伸展树的术语,X、P和G可以形成一个一字形链或之字形链(两个方向中的任一个方向)。...在两种情形下,子树的新根被涂成黑色,因此,即使原来的曾祖是红的,我们也排除了两个相邻红节点的可能性。同样中要的是,这些旋转的结果是通向A、B和C诸路径上的黑节点数保持不变。到现在为止一切顺利。...2、自顶向下红黑树上滤的实现需要用一个栈或用一些父指针保存路径。我们看到,如果我们使用一个自顶向下的过程,实际上是对红黑树应用从顶向下保证S不会是红的过程,则伸展树会更有效。这个过程在概念上是容易的。...注意,对于红黑树带有一个儿子的节点的情形,我们不想使用这种方法进行,因为这可能在树的中部连接两个红色节点,为红黑条件的实现增加苦难。
但它是如何保证一棵n个结点的红黑树的高度始终保持在logn的呢?这就引出了红黑树的5个性质: 每个结点要么是红的要么是黑的。 根结点是黑的。...正是红黑树的这5条性质,使一棵n个结点的红黑树始终保持了logn的高度(红黑树的高度至多为2log(n+1)证明略),从而也就解释了上面所说的“红黑树的查找、插入、删除的时间复杂度最坏为O(log n)...对于树的旋转,能保持不变的只有原树的搜索性质,而原树的红黑性质则不能保持,在红黑树的数据插入和删除后可利用旋转和颜色重涂来恢复树的红黑性质。...三、红黑树的插入 将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。...那接下来,想办法使之"满足特性(4)",就可以将树重新构造成红黑树了。 首先来看下伪代码描述: ?
在JDK8之前其实就已经有红黑树的应用,比如TreeMap的底层就是用了红黑树的数据结构。本文主要是为了讲解JDK8中HashMap底层数据结构的铺垫。...一、二叉查找树BST 红黑树的本质就是一颗二叉查找树,二叉查找树的特点如下: (1)左节点的值都小于或等于其父类(父类或根节点)的值。...二、红黑树RBTree 红黑树其实是基于二叉查找树的一颗平衡二叉查找树,具有以下特点: (1)结点是红色或黑色的,在hashMap实现中用boolean的true和false表示红色或黑色。...再经过变色后,形成最终的红黑树: ? 三、总结 个人觉得红黑树是一个挺不错的思想,红黑树在BST的基础上还引入了颜色的特点,通过变色和旋转来保持红黑树的特点,保证树的平衡。...红黑树的前身其实是234树,有兴趣的小伙伴可以了解下234树,234树和红黑树的操作完全是等价的。之所以在java中使用红黑树的数据结构是因为如果直接使用234树实现会非常繁琐。
领取专属 10元无门槛券
手把手带您无忧上云