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

C++】AVL和红黑插入

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

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

    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.先确定是否是一棵二叉搜索:如果中序遍历可得到一个有序序列,就说明为二叉搜索

    37930

    c++】AVL

    目录 1.AVL介绍 2.构建AVL 2.1节点构建 2.2 AVL插入 2.3AVL旋转 左左:右单旋 右右:左单旋 左右:先左单旋再右单旋 右左:先右单旋再左单旋 完善插入函数: 2.4...其他函数 1.AVL介绍 二叉搜索虽可以缩短查找效率,但如果数据有序或接近有序二叉搜索将退化为单支,查 找元素相当于在顺序表中搜索元素,效率低下 当向二叉搜索中插入新结点后,如果能保证每个结点左右子树高度之差绝对值不超过...1(需要对结点进行调整),即可降低高度,从而减少平均搜索长度 一棵AVL或者是空,或者是具有以下性质二叉搜索: 它左右子树都是AVL 左右子树高度之差==(简称平衡因子)绝对值不超过...1(-1/0/1)== 在一个叶节点插入一个元素,一定会改变当前父节点平衡因子 平衡因子是右高度减左高度,插到右边,当前父节点平衡因子++,反之- -,是否影响祖辈(父节点再往上走)平衡因子...意味着插入不改变高度,就不改变祖辈平衡因子 如果平衡因子等于二了,就需要进行旋转,后面进行讲解 2.构建AVL 2.1节点构建 template struct AVLTreeNode

    4600

    C++: AVL

    一棵AVL或者是空, 或者是具有以下性质二叉搜素: 它左右子树都是AVL 左右子树高度之差(简称平衡因子)绝对值不超过1(-1/0/1) 如果一棵二叉搜索是高度平衡,它就是AVL...AVL插入 AVL就是在二叉搜索基础上引入了平衡因子,因此AVL也可以看成是二叉搜索。...那么AVL插入过程可以分为两步: 按照二叉搜索方式插入新节点 调整节点平衡因子 // 1. 先按照二叉搜索规则将节点插入到AVL中 // 2....(面试一般不考察) 具体实现可参考《算法导论》或《数据结构-用面向对象方法与C++描述》殷人昆版。 7....因此:如果需要一种查询高效且有序数据结构,而且数据个数为静态(即不会改变),可以考虑AVL,但一个结构经常修改,就不太适合。

    10410

    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 是存储静态数据理想容器

    14520

    C++】AVL

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

    12210

    C++——AVL

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

    24720

    C++】AVL

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

    50100

    C++详解

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

    39020

    C++】AVL

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

    30530

    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.8K20

    C++ 重心和直径

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

    18810

    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+

    42110

    C++】红黑

    今日更新了红黑相关内容 欢迎大家关注点赞收藏⭐️留言 红黑概念 红黑,是一种二叉搜索,但在每个结点上增加一个存储位表示结点颜色,可以是Red或 Black。...红黑性质 每个结点不是红色就是黑色 根节点是黑色 如果一个节点是红色,则它两个孩子结点是黑色。...最长路径<=最短路径*2 (最长路径就是一红一黑间隔,最短路径就是全黑) 节点定义 红黑插入操作 红黑是在二叉搜索基础上加上其平衡限制条件,因此红黑插入可分为两步: 按照二叉搜索规则插入新节点...检测新节点插入后,红黑性质是否造到破坏 新节点默认颜色是红色,因此:如果其父亲节点颜色是黑色,没有违反红黑任何性质,则不需要调整;但当新插入节点父亲节点颜色为红色时,就违反了性质三不能有连在一起红色节点...AVL比较 红黑和AVL都是高效平衡二叉,增删改查时间复杂度都是O(logN),红黑不追求绝对平衡,其只需保证最长路径不超过最短路径2倍,相对而言,降低了插入和旋转次数, 所以在经常进行增删结构中性能比

    6910

    C++】————红黑

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

    6310

    C++实现AVL

    为什么要有AVL 我们都知道二叉搜索规则,插入一个节点时,如果比当前节点值大就到右边,反之则到左边。这样使得中序遍历这颗可以得到一个有序数组。...1.AVL AVL是具有以下性质二叉搜索: 1.它左右子树都是AVL 2.左右子树高度之差(简称平衡因子)绝对值不超过1. 如果一颗二叉搜索是高度平衡。那么它就是AVL。...AVL插入可以说是AVL最重要内容,不过因为AVL是再二叉平衡基础上加入了平衡因子,所以最开始插入操作和二叉平衡是相同。...,先进行二叉搜索插入操作,然后在节点插入过后,因为AVL平衡性可能会改变,所以我们要开始对进行处理。...如果pParent平衡因子为正负2,则pParent平衡因子违反平衡性质,需要对其进行旋转处理 2.2.1.AVL旋转 如果在一颗原本平衡AVL中插入一个新节点,造成了AVL不平衡

    8410

    c++】红黑

    目录 1.红黑介绍与性质 2.节点定义 3.红黑插入: 情况一:父节点与叔节点均为红 情况二:父节点为红,叔节点为黑或者不存在 情况三:父节点为红,叔节点为黑或者不存在(双旋) 代码实现 4.红黑验证...1.红黑介绍与性质 红黑,是一种二叉搜索,但在每个结点上增加一个存储位表示结点颜色,可以是Red或Black。...通过对任何一条从根到叶子路径上各个结点着色方式限制,红黑确保没有一条路径会比其他路径长出俩倍,因而是接近平衡 每个结点不是红色就是黑色 根节点是黑色 如果一个节点是红色,则它两个孩子结点是黑色...,因此:如果其双亲节点颜色是黑色,没有违反红黑任何性质,则不需要调整;但当新插入节点双亲节点颜色为红色时,就违反了性质三不能有连在一起红色节点,此时需要对红黑分情况来讨论 情况一:父节点与叔节点均为红...如果左子树或右子树有一个不满足红黑性质,则整个函数返回false 最终,IsBalance将返回一个布尔值,表示是否满足红黑性质。

    7700

    C++: 红黑

    红黑概念 红黑, 是一种二叉搜索, 但在每个节点上增加一个存储位表示节点颜色, 可以是Red或者Black....红黑插入 插入新节点颜色设置为红色, 因为破坏规则3代价更大, 所以我们主动破坏规则4. 首先还是按照二叉搜索规则进行插入, 只是在二叉搜索规则上限制条件....// } 检查插入新节点之后, 红黑性质是否遭到破坏 因为新节点默认颜色是红色,因此:如果其双亲节点颜色是黑色,没有违反红黑任何性质,则不需要调整; 但当新插入节点双亲节点颜色为红色时...红黑验证 红黑检测分为两步: 检测其是否满足二叉搜索(中序遍历是否为有序序列) 检测其是否满足红黑性质 bool IsBalance() { if (_root == nullptr...红黑与AVL比较 红黑和AVL都是高效平衡二叉,增删改查时间复杂度都是O( log_2 N ),红黑不追求绝对平衡,其只需保证最长路径不超过最短路径2倍,相对而言,降低了插入和旋转次数

    7810
    领券