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

C++】AVL和红黑插入

,因为cur只是一个局部变量,无法改变函数外面结点链接关系,所以我们还需要一个局部变量parent,在cur向下迭代之前把其地址给到parent,那么等到cur迭代到正确插入结点位置时,我们通过局部指针...,如果是1或-1,则继续向上让cur和parent迭代更新平衡因子,如果是0则说明parent子树高度没有改变无须向上更新,就该停下来了。...= subL->_right; int bf = subLR->_bf;// 单旋过后,subLR平衡因子会被改变,提前记录一下平衡因子 RotateL(parent->_left);...至于红黑结点颜色调节,大家可以对照上面我画图进行颜色改变,这个很简单,这里也不再多说了。...//我们可以改变结点结果,或者利用递归算法函数栈帧独立性进行解决,每一层栈帧黑色结点数量都是不同

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

C++】AVL

AVL树节点定义 想要实现一个AVL ,首先我们得有节点,而节点中我们需要存:该节点父节点、该节点右孩子、该节点左孩子、平衡因子以及数据类型;为了方便后面红黑学习我们在这里给数据类型是...AVL插入 AVL就是在二叉搜索基础上引入了平衡因子,因此AVL也可以看成是二叉搜索。...- - -左右:先左单旋再右单旋(左右双旋) 如下图所示,我们无论在 subLR 节点左右子树(是满AVL前提下)插入时候,会改变 subLR 高度,进而会往上更新,一直更新到根 parent...—右左:先右单旋再左单旋(右左双旋) 如下图所示,我们无论在 subRL 节点左右子树(是满AVL前提下)插入时候,会改变 subRL 高度,进而会往上更新,一直更新到根 parent,此时单旋就满足不了这种情况了...AVL验证 AVL是在二叉搜索基础上加入了平衡性限制,因此要验证AVL,可以分两步: 验证其为二叉搜索 如果中序遍历可得到一个有序序列,就说明为二叉搜索 验证其为平衡 每个节点子树高度差绝对值不超过

9210

C++——AVL

概念 二叉搜索虽可以缩短查找效率,但如果数据有序或接近有序二叉搜索将退化为单支,查找元素相当于在顺序表中搜索元素,效率低下。...1(需要对结点进行调整),即可降低高度,从而减少平均搜索长度。...一棵AVL或者是空,或者是具有以下性质二叉搜索: 它左右子树都是AVL左右子树高度之差(简称平衡因子)绝对值不超过1(-1/0/1) 右子树高度-左子树高度=平衡因子 这棵是平衡...节点定义 对于AVL结点定义,不仅仅多了一个平衡因子,还多了一个父节点指针,是一个三叉链结构。...}; 旋转 旋转目的; 1.让这棵左右高度差不超过1 2.旋转之后也要保持这棵是AVL 3.更新调节平衡因子 4.旋转后高度要和插入前相同 左单旋与右单旋 左单旋: 对于左单旋这张图针对是很多种情况

21120

C++:AVL

AVL,即是高度平衡二叉搜索。 一棵AVL是一棵平衡二叉搜索,也能是一棵空。...AVL性质: ①它左右子树都是AVL ②左右子树高度之差(简称平衡因子)绝对值不超过1(-1/0/1) ③如果一棵二叉搜索是高度平衡,它就是AVL。...//如果平衡因子是0,任何节点平衡因子都没被改变 if (parent->_bf == 0) { break; } else if (parent->_bf ==...1 || parent->_bf == -1) { //如果平衡因子是1或-1,那么就说明,父节点往上节点平衡因子有可能被改变了 cur = parent; parent...验证AVL 由于AVL是在二叉搜索基础上加了平衡性后得到,因此需要确认一棵是AVL,那么就需要以下两步: 1.先确定是否是一棵二叉搜索:如果中序遍历可得到一个有序序列,就说明为二叉搜索

35530

C++】AVL

,不用继续向上更新祖先节点平衡因子; 如果更新后父节点平衡因子为1/-1,说明插入前父节点平衡因子为0,左右子树高度相同,插入后改变了左子树/右子树高度,子树整体高度也变了,此时需要继续向上更新祖先节点平衡因子...0,左右子树高度相同,插入后改变了左右子树高度,此时需要向上更新祖先节点平衡因子,且最多可以更新到根节点平衡因子 //3.更新祖先节点平衡因子过程中,祖先平衡因子变为2/-2,此时这棵子树不再是...C++描述》,里面有 AVL 删除具体思路讲解和代码实现。...;因此如果需要一种查询高效且有序数据结构,而且数据个数为静态(即不会改变) 或数据较少进行插入和删除,则可以考虑 AVL ,但如果一个结构经常进行修改,AVL 则不太适合。...0,左右子树高度相同,插入后改变了左右子树高度,此时需要向上更新祖先节点平衡因子,且最多可以更新到根节点平衡因子 //3.更新祖先节点平衡因子过程中,祖先平衡因子变为2/-2,此时这棵子树不再是

43900

C++详解

定义 (Tree)是n(n≥0)个结点有限集。n=0时称为空。...; 孩子节点或子节点:一个节点含有的子树根节点称为该节点子节点; 兄弟节点:具有相同父节点节点互称为兄弟节点; 度:一棵中,最大节点度称为度; 节点层次:从根开始定义起,根为第1层...森林:由m(m>=0)棵互不相交集合称为森林; 二叉   二叉是数据结构中一种重要数据结构,也是表家族最为基础结构。   ...二叉定义:二叉每个结点至多只有二棵子树(不存在度大于2结点),二叉子树有左右之分,次序不能颠倒。 ⼆叉种类 ⼆叉有两种主要形式:满⼆叉和完全⼆叉。...完全二叉 对一棵具有n个结点二叉按层序编号,如果编号为 i(1 ≤ i ≤ n)结点与同样深度满二叉中编号为i结点在二叉位置完全相同,则这棵二叉称为完全二叉 二叉性质

18320

C++】AVL

1( 需要对结点进行调整 ) ,即可降低高度,从而减少平均搜索长度。...一棵AVL或者是空,或者是具有以下性质二叉搜索: 它左右子树都是AVL 左右子树高度之差(简称平衡因子)绝对值不超过1(-1/0/1) 如果一棵二叉搜索是高度平衡,它就是 AVL...K和V详情参考:二叉搜索 2.插入 AVL 就是在二叉搜索基础上引入了平衡因子,因此 AVL 也可以看成是二叉搜索。...那么 AVL 插入过程可以分为两步: 按照二叉搜索方式插入新节点 调整节点平衡因子 插入节点方法和我们前文讲到二叉搜索插入方法一致,我们在此就不重复叙述了。...因此:如果需要一种查询高效且有序数据结构,而且数 据个数为静态(即不会改变),可以考虑AVL,但一个结构经常修改,就不太适合。

28030

C++【AVL

parent == _root) { //如果原父亲为根,那么此时需要更新 根 subR->_parent = nullptr; _root = subR; } else { //单纯改变链接关系...,所以其中 黄色色块 可以变换成 任意高度子树,无论如何变换,左单旋 逻辑都不会发生改变 旋转逻辑: 确定 parent、subR、subRL 将 subRL 托付给 parent 令 parent...成为 subR 左子树 需要特别注意父指针更改以及根节点更新 注意: subRL 可能是 nullptr,在改变其链接关系时,需要判断一下,避免空指针解引用行为;parent 可能是 根节点,subR...成为 subL 右子树 需要特别注意父指针更改以及根节点更新 注意: subLR 可能是 nullptr,在改变其链接关系时,需要判断一下,避免空指针解引用行为;parent 可能是 根节点,subL...C++【AVL全部内容了,在本文中,我们首先了解了什么是 AVL ,然后对其进行了实现,AVL 光是一个 插入 操作,就已经涉及了 四大旋转情况,其中每种情况都需要自己画图分析,AVL 是存储静态数据理想容器

11320

C++ N叉实现

引言最近一个项目需要使用多叉树结构来存储数据,但是基于平时学习都是二叉结构,以及网上都是二叉为基础来进行学习,所以今天实现一个多叉数据结构。...理论基础和二叉:多叉:多叉,顾名思义,就是一个节点可能有若干个子节点,构造一个较为复杂树结构。遍历:遍历一般认为有三种:前序遍历二叉、中序遍历二叉、后序遍历二叉[2]。...前序遍历二叉。若二叉为空,则为空操作,返回空否则访问根结点-->前序遍历左子树-->前序遍历右子树。(2). 中序遍历二叉。...C++指针: 指针即为地址,一个指针对应一个地址,*p = &a [3−4],其中a保存是变量值,具体数据,*p 或者 &a表示是一个地址编号,比如:0x80651165,即:a = 5 , p =...基于C++N叉实现头文件:#include #include using namespace std;#ifndef DBM_MTREE_H#define DBM_MTREE_Htypedef

2.6K20

C++ 重心和直径

重心也称为质点,有一个很官方定义:如果在中选择某个节点并删除,这棵将分为若干棵子树,统计子树节点数并记录最大值。取遍树上所有节点,使此最大值取到最小节点被称为整个重心。...如下图所示,节点3和7都是重心,且在树上是相邻。 以重心为根时,所有子树大小都不超过整棵大小一半。...中所有点到某个点距离和中,到重心距离和是最小;如果有两个重心,那么到它们距离和一样。 把两棵通过一条边相连得到一棵新,那么新重心在连接原来两棵重心路径上。...以节点3为根节点,使用DFS搜索算法,可以容易得到子树以及以3为根节点节点数量,因为整棵节点数量是已知,如果知道了以节点3为根节点子树节点数,则其它部分节点数量可以轻松计算出来:整棵节点数...直径 什么是直径? 树上任意两节点之间最长简单路径即为「直径」。显然,一棵可以有多条直径,他们长度相等。可以用两次 DFS 或者树形 DP 方法在 O(n) 时间求出树直径。

12910

C++ 不知系列之初识

T1、T2又可以认为是由它子节点为根节点子子树组成,以此类推,一直到叶节点为止。 相关概念: 节点度:一个节点含有子树个数称为该节点度。 度:一棵中,最大节点度称为度。...类型: 无序结点之间没有顺序关系,这种树称为无序。 有序中任意节点子节点之间有左右顺序关系。如下图,任一节点左子节点值小于右子节点值。...二叉:如果任一节点最多只有 2 个子节点,则称此树结构为二叉。上图有序也是一棵二叉。 完全二叉:一棵二叉至多只有最下面两层节点子结点可以小于 2。...char root) { cout<<3<<endl; for(int r=1; rsize; r++) { for(int c=1; csize; c+...showAll() { cout<<"矩阵信息"<<endl; for(int r=1; rsize; r++) { for(int c=1; csize; c+

39210

C++之AVL

因此map、set等关联式容器底层结构是对搜索二叉进行平衡处理平衡二叉搜索。 本节我们就来了解平衡搜索二叉AVL相关概念。...一棵AVL要具有以下性质: 该如果是空,那么它是AVL; 它左右子树是AVL; 左右子树高度差(命名为平衡因子)绝对值不超过1(可以是1/0/-1) 上图红色标识是该结点平衡因子...因此,如果需要一种查询高效且有序数据结构,并且数据结构个数为静态(不会发生改变),可以考虑使用AVL,但是如果该结构需要经常被修改AVL就不太适合了。...总结 以上就是今天要讲内容,本文介绍了C++AVL相关概念。...本文作者目前也是正在学习C++相关知识,如果文章中内容有错误或者不严谨部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。

78250

C++红黑

C++红黑 零、前言 一、红黑概念及性质 二、红黑结点定义 三、红黑插入操作 1、变色处理 2、单旋+变色 3、双旋+变色 4、插入实现 四、红黑验证 五、红黑删除 六、红黑与*...*AVL**比较 零、前言 本章继AVL后继续讲解学习C++中另一个二叉搜索–红黑 一、红黑概念及性质 概念: 红黑,是一种二叉搜索,但在每个结点上增加一个存储位表示结点颜色...,可以是Red或Black 通过对任何一条从根到叶子路径上各个结点着色方式限制,红黑确保没有一条路径会比其他路径长出俩倍,因而是接近平衡 注:AVL是严格平衡二叉搜索,左右子树高度不超过...,所以最长路径不超过最短路径长度二倍 示图: 二、红黑结点定义 对于红黑来说以颜色来代替AVL平衡因子作用,除此之外在定义上没有什么区别 实现代码: enum Colour//...红黑是在二叉搜索基础上加上其平衡限制条件,当违反限制条件时就需要做出相应调整 红黑插入可分为两步: 按照二叉搜索规则插入新节点 新节点插入后检查红黑性质是否造到破坏

35710

C++【红黑

---- 前言 红黑是平衡二叉搜索一种,红黑性能优异,广泛用于实践中,比如 Linux 内核中 CFS 调度器就用到了红黑,由此可见红黑重要性。...,这里不再展开叙述,可以复用 AVL 中旋转代码,并且最后不需要调整平衡因子 《C++【AVL】》 注意: 红黑调整可以分为 右半区 和 左半区 两个方向(根据 grandfather 与 parent...) { //此时 parent 为根,需要改变根 _root = subR; _root->_parent = nullptr; } else { //根据不同情况进行链接...,所以需要保存一下数据样本 关于 红黑 详细操作可以参考这篇 Blog:《红黑C++实现)》 ---- 3、AVL VS 红黑 AVL 和 红黑 是 平衡二叉搜索 两种优秀解决方案,...最后可以和库中切磋一下~ 本文中涉及源码:《RBTree 博客》 ---- 总结 以上就是本次关于 C++【红黑全部内容了,在本文中,我们首先了解了什么是 红黑,然后对其进行了实现,作为数据结构中大哥

17310

如何从C++转Python:改变思维方式

在本文中,asya f 告诉我们,从 C++转向 Python,是一次「从个人到社区」思维转变。 从 C++ 转 Python 时候,我已经是一个有四年全职工作经验软件开发者了。...从 C++到 Python 过渡已经有了大约三年时间,我觉得是时候总结一下这段时间经历了。回想起来,我改变不只是自己所用编程语言,还有工作方式和我对代码看法。...从 C++跳到 Python(图源:Unsplash ;上传者:Erik Dungan ) C++是跳水,Python 是潜水 C++给人感觉就像是一头扎进奇幻神秘大海里——它是如此美妙,但需要更多学习和训练...深入 C++并努力成为幸存者 C++更为严格,在你犯错时候会更加严厉地惩罚你。一次都没有收到过 Segmentation fault 编码会话算不上有效编码会话。...结语 无论其他人说什么,切换到另一种编程语言都不容易,尤其是切换到一种与你用过语言完全不同语言。你要花时间去学习、挖掘、发现。但最重要是,你要改变不仅仅是语言,还有编码风格和工作方法。

1K30

【五一创作】|【C++】AVL实现

1.AVL概念 二叉搜索虽可以缩短查找效率,但如果数据有序或接近有序二叉搜索将退化为单支,查 找元素相当于在顺序表中搜索元素,效率低下, 所以在此基础上提出解决办法: 当向二叉搜索中插入新节结点时...,如果能保证每个节点左右子树高度之差绝对值不超过1即可降低高度,从而减少平均搜索长度 AVL又称平衡二叉搜索 2....AVL性质 AVL性质: 1.它左右子树都是AVL 2.左右子树高度之差(平衡因子)绝对值不超过1(1/0/-1) 平衡因子=右子树高度-左子树高度 3.AVL实现 在实现结构与插入功能时...插入前parent平衡因子是-1或者1,插入前一边高一边低,插入节点到矮那边,高度不变 更新平衡因子 插入新增节点后,更新平衡因子 如果更新之后,平衡因子没有问题(绝对值<=1),说明插入对平衡机构没有影响...中序遍历 平衡中序遍历与搜索中序遍历基本一致,root->_kv.first 实际上代表是kv中key值 如果不懂可以查看:二叉搜索 判断一颗二叉是否为平衡 因为平衡因子是自己更新

17630

C++】RBTree——红黑

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

14920

C++ 不知系列之表达式

为何还把后缀表达式转换为二叉,然后再在结构基础上求解,且不是饶了一个弯子,其实不然。...另受相关算法加持,也可以把后缀表达式求解过程变得很易理解且具有艺术性。 2. 表达式 如何把中缀表达式转换为后缀表达式,此文不再负赘。仅讲解如何把后缀表达式转换为表达式,以及对表达式求解。...2.2 求解过程 表达构建完毕,便可以完全站在角度思考问题。常规操作无非就是深度搜索以及广度搜索。而深度搜索又分为前序遍历、中序遍历和后序遍历。...此外,在 C++ 等语言有些编译器中,对逻辑表达式计算会采用一种“短路”策略: 在形如 a&b 逻辑表达式中,会先计算a部分值,如果a=0,那么整个逻辑表达式值就一定为0,故无需再计算b部分值...把后缀表达式映射成二叉,其一,可以通过结构清晰看到后缀表达式底层逻辑,其二可以基于算法直观易懂得到结果。再因节点是可以是复杂数据类型,可以在遍历过程中封装复杂结果。

25610
领券