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

C++【

---- 前言 是平衡二叉搜索中的一种,性能优异,广泛用于实践中,比如 Linux 内核中的 CFS 调度器就用到了,由此可见的重要性。...,这里不再展开叙述,可以复用 AVL 中的旋转代码,并且最后不需要调整平衡因子 《C++【AVL】》 注意: 的调整可以分为 右半区 和 左半区 两个方向(根据 grandfather 与 parent...左单旋 右左,右左双旋 左半区 左左,右单旋 左右,左右双旋 得益于前面 AVL 旋转操作的学习, 这里在编写 旋转 相关代码时,没什么大问题 的 DeBug 逻辑与 AVL 一致,...详细操作可以参考这篇 Blog:《C++实现)》 ---- 3、AVL VS AVL 是 平衡二叉搜索 的两种优秀解决方案,既然两者功能一致,那么它们的实际表现如何呢...,最后可以和库中的切磋一下~ 本文中涉及的源码:《RBTree 博客》 ---- 总结 以上就是本次关于 C++【】的全部内容了,在本文中,我们首先了解了什么是 ,然后对其进行了实现,作为数据结构中的大哥

17010

C++

C++ 零、前言 一、的概念及性质 二、结点的定义 三、的插入操作 1、变色处理 2、单旋+变色 3、双旋+变色 4、插入实现 四、的验证 五、的删除 六、与*...*AVL**的比较 零、前言 本章继AVL后继续讲解学习C++中另一个二叉搜索 一、的概念及性质 概念: ,是一种二叉搜索,但在每个结点上增加一个存储位表示结点的颜色...: 第三条性质说明不能存在连续(父子相连)的结点,可以存在连续的结点,又由于第四条性质每个路径上的结点个数都相同 ,所以对于最短路径来说一定是都是黑色结点,对于最长路径来说一定是黑色红色相间的路径...,所以最长路径不超过最短路径长度的二倍 示图: 二、结点的定义 对于来说以颜色来代替AVL的平衡因子的作用,除此之外在定义上没有什么区别 实现代码: enum Colour//...的检测分为两步: 检测其是否满足二叉搜索(中序遍历是否为有序序列) 检测其是否满足的性质 实现代码: bool IsRBTree() { //空 if

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

C++:

的概念 是一棵二叉搜索,但是通过增加一个存储位表示结点的颜色RED或BLACK。...从性质上分析的近似平衡 一颗最短的路径是这条路径全。最长是一相间路径。 对于近似平衡来说: ①最优情况就是左右平衡,此时每条路径都是全或者是一相间,形成满二叉。...树节点的定义 树节点的定义,跟AVL的区别就是不需要平衡因子,而加入了颜色。...的旋转直接复用AVL的旋转的代码即可。 验证 的验证分两步:①通过中序遍历验证其是否满足二叉搜索的性质。②验证是否满足的性质。...也就是因为在修改操作方面的性能比AVL好,因此都用在了C++的STL库(map/set、mutil_map/mutil_set),Java库、Linux内核等等地方。

22420

C++】RBTree——

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

14720

C++之

四、的结构 五、插入操作 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++中的相关概念。

42630

(一):构建

这一篇文章就来看看如何构建 对于平衡二叉的构建,可以参考小程序中的文章(C++版)。...平衡二叉 属于平衡二叉,但是并非严格意义上的平衡二叉,因为平衡二叉要求节点的左右子树高度差不超过1, 而放弃了这种高度平衡,利用对结点上色的操作来保证相对平衡,这其中原因大概是维护一个绝对平衡的二叉代价太大...但如果插入频率小或者只有一次构建,那么平衡二叉的查询性能还是比高。...此时构建平衡分为4种情况: 情况一:为空,此时插入结点充当根结点,上色为 情况二:插入结点已经存在,此时替换插入结点值即可 情况三:插入结点的位置,其父结点是黑色,此时平衡未打破,插入完成...到这里就构建完成了 相对于构建新增,的删除情况更为复杂,由于时间关系(这周只有一天休息加上绘图太费劲),留到下一次分享。 构建代码 构建源码

1.6K42

概念 ,是一种二叉搜索,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。...通过对任何一条从根到叶子的路径上各个结点着色方式的限制,确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。...的性质 每个结点不是红色就是黑色 根节点是黑色的 如果一个节点是红色的,则它的两个孩子结点是黑色的,中没有连续的节点 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点...插入 的叔叔是关键 u存在且为,变色继续向上处理 u不存在或存在且为,旋转(单旋+双旋)+变色 情况一:cur为,parent为,grandfather为(固定),uncle存在且为...u不存在 u存在且为 情况三:cur为,parent为,grandfather为(固定),u不存在/u存在且为(双旋+变色) u不存在 u存在且为 插入代码: bool insert

44020

前言 的应用还是比较广泛的。比如Java8的HashMap的底层就用到了,还有TreeMap和TreeSet也用到了。 下面主要以下几个方面学习一下。...1)二叉查找BST 2)RBTree的规则、增删查 3)的Java实现。...其中两款具有代表性的平衡分别为AVL。AVL由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如。...下图中这棵,就是一颗典型的: ? 什么情况下会破坏的规则,什么情况下不会破坏规则呢?我们举两个简单的栗子: 添加节点 1.向原插入值为14的新节点: ?...请参考BST的查找操作代码。 关于自平衡的调整,插入和删除节点的时候都涉及到很多种Case,由于篇幅原因无法展开来一一列举,有兴趣的朋友可以参考维基百科,里面讲的非常清晰。

83131

,因此就出现了很多自平衡的二叉查找,这些自平衡二叉查找的查询效率都会稳定在O(logN),就是一种自平衡的二叉查找。...下面我们会红的特征、插入以及删除来分析是如何进行自平衡的。...特征 想要了解如何自平衡,就必须了解的特征,因为自平衡操作都是围绕这些特征来的,一旦一个因为插入和删除节点打破了自身的特征,那么他就需要进行自平衡(变色、旋转)来使得二叉重新满足的特征...通过上述特征,决定了的一个重要特性:从根到叶子的最长的可能路径不多于最短路径的两倍长。 下图是一张示意图: ?...,需要我们细细揣摩,并且反复的研究,在了解的基本概念以后,我们后续会分析一下HashMap中的实现以及着手自己实现一个

90720

这样就能让整棵的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。 # 什么是 的英文是 “Red-Black Tree”,简称 R-B Tree。...所以,的高度只比高度平衡的 AVL 的高度(log2n)仅仅大了一倍,在性能上,下降得并不多。这样推导出来的结果不够精确,实际上的性能更好。...# 平衡调整 # 插入操作的平衡调整 规定,插入的节点必须是红色的。而且,二叉查找中新插入的节点都是放在叶子节点上。...这一部分操作跟普通的二叉查找的删除操作无异; 然后把节点 c 的颜色设置为跟节点 a 相同的颜色; 如果节点 c 是黑色,为了不违反的最后一条定义,我们给节点 c 的右子节点 d 多加一个黑色,...,我们给节点 d 的右子节点 c 多加一个黑色,这个时候节点 c 就成了 “ - ” 或者 “ - ”; 这个时候,关注节点变成了节点 c,第二步的调整操作就会针对关注节点来做。

35610

的介绍 (Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找。...是特殊的二叉查找,意味着它满足二叉查找的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,还包括许多额外的信息。...的每个节点上都有存储位表示节点的颜色,颜色是(Red)或(Black)。 的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。...因而,是相对是接近平衡的二叉。...示意图如下: AVL的介绍 https://www.cnblogs.com/skywang12345/p/3577479.html AVL是高度平衡的而二叉

70300

什么是 依然是一棵二分搜索,《算法导论》中的定义如下: 每个节点或者是红色的,或者是黑色的 根节点是黑色的 每一个叶子节点(最后的空节点)是黑色的 如果一个节点是红色的,那么他的孩子节点都是黑色的...如下图所示: 与2-3的等价性   我们在这里定义所有的红色节点都是向左倾斜的,红色节点代表与父亲节点相融合,由于我们可以通过2-3画出一个棵:   由此可知,是保持“...和AVL:由于的最大高度是2logn,所以在查找时,相比于AVL会慢一些,而的添加和删除元素比AVL更快一些,如果只是用于查询,AVL的性能要更高一些。   ...由于我们在本文是定义的所有红色节点都是向左倾斜的,当我们新添加的红色节点在根节点的右侧时,我们需要先进行左旋转擦欧总,然后再进行染色操作,在我们左旋转的过程中并不保持的性质,如下图: 左旋转的代码实现...,就分析到这里了,下面让我们来用代码实现一个的添加操作: public class RBTree, V> { private static

11110

在JDK8之前其实就已经有的应用,比如TreeMap的底层就是用了的数据结构。本文主要是为了讲解JDK8中HashMap底层数据结构的铺垫。...一、二叉查找BST 的本质就是一颗二叉查找,二叉查找的特点如下: (1)左节点的值都小于或等于其父类(父类或根节点)的值。...二、RBTree 其实是基于二叉查找的一颗平衡二叉查找,具有以下特点: (1)结点是红色或黑色的,在hashMap实现中用boolean的true和false表示红色或黑色。...再经过变色后,形成最终的: ? 三、总结 个人觉得是一个挺不错的思想,在BST的基础上还引入了颜色的特点,通过变色和旋转来保持的特点,保证的平衡。...的前身其实是234,有兴趣的小伙伴可以了解下234,234的操作完全是等价的。之所以在java中使用的数据结构是因为如果直接使用234实现会非常繁琐。

69220

但它是如何保证一棵n个结点的的高度始终保持在logn的呢?这就引出了的5个性质: 每个结点要么是的要么是的。 根结点是的。...正是的这5条性质,使一棵n个结点的始终保持了logn的高度(的高度至多为2log(n+1)证明略),从而也就解释了上面所说的“的查找、插入、删除的时间复杂度最坏为O(log n)...对于的旋转,能保持不变的只有原的搜索性质,而原性质则不能保持,在的数据插入和删除后可利用旋转和颜色重涂来恢复性质。...三、的插入 将一个节点插入到中,需要执行哪些步骤呢?首先,将当作一颗二叉查找,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该,使之重新成为一颗。...那接下来,想办法使之"满足特性(4)",就可以将重新构造成了。 首先来看下伪代码描述: ?

73440

历史上AVL流行的另一变种是(red black tree)。...这种情形只有X和P是的,G是的,因为否则就会在插入前有两个相连的红色节点,违反了的法则。采用伸展的术语,X、P和G可以形成一个一字形链或之字形链(两个方向中的任一个方向)。...在两种情形下,子树的新根被涂成黑色,因此,即使原来的曾祖是的,我们也排除了两个相邻节点的可能性。同样中要的是,这些旋转的结果是通向A、B和C诸路径上的节点数保持不变。到现在为止一切顺利。...2、自顶向下树上滤的实现需要用一个栈或用一些父指针保存路径。我们看到,如果我们使用一个自顶向下的过程,实际上是对红应用从顶向下保证S不会是的过程,则伸展会更有效。这个过程在概念上是容易的。...注意,对于带有一个儿子的节点的情形,我们不想使用这种方法进行,因为这可能在的中部连接两个红色节点,为条件的实现增加苦难。

72110

手写C++实现)

手写C++实现)在计算机科学中,(Red-Black tree)是一种自平衡的二叉搜索,它是在B的基础上添加了颜色标记,用以保证其在插入和删除等操作后能够保持平衡。...本文将带你一步步实现的基本功能,包括插入、删除和搜索等操作。我们使用C++语言来实现的数据结构和算法。...然后,根据的性质对进行修复,以保持的平衡。 在删除操作中,我们需要处理以下情况:当删除节点是红色节点时,直接删除,不会影响的平衡。...当删除节点是黑色节点时,需要进行额外的处理才能保持的平衡。 删除操作的伪代码如下:pythonCopy codedef delete(self, data): node = self...._remove_fixup(node.parent) # 修复 删除修复操作的伪代码如下:pythonCopy codedef _remove_fixup(self, node): while

22810

那么问题来了,如何在删除和插入数据的时候保证以上性质呢,的策略就是改变颜色和旋转,改变颜色很好理解,那么旋转是什么呢?...(1)把父结点变为黑色 (2)把祖父结点变为红色 (爷爷) (3)以祖父结点旋转(爷爷) 插入数据示例 假设有如下的,符合的特征 ?...现在插入数据6,颜色假设为红色,这样就不符合的特征,所以就要对其进行变换 ?...变为黑色,祖父结点15变为红色,那么再对祖父结点15进行右旋操作,同样当前结点变为祖父结点15,至此现在的已经符合特征,变换完成 可以看出变换完的树结构依然稳定,所以就解决了插入和删除的问题...的应用 JDK HashMap JDK TreeMap JDK TreeSet Windows文件搜索

92620

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券