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

AVL树再平衡算法:如何在Zig-Zig和Zig-Zag情况之间做出决定?

AVL树是一种自平衡的二叉搜索树,其旨在保持树的高度平衡,以确保插入和删除操作的效率。当插入或删除节点后破坏了树的平衡性时,需要进行调整来恢复平衡。

Zig-Zig和Zig-Zag是AVL树中两种不同的失衡情况,需要通过旋转操作来进行修复。以下是解决这两种情况的决策过程:

  1. Zig-Zig情况:当插入或删除导致某节点的两个子节点都是该节点的同一边子节点时,出现Zig-Zig情况。在这种情况下,需要对父节点进行一次单旋转,然后对祖父节点进行一次单旋转。

例如,假设我们插入了一个节点到AVL树的右子树的右子树中:

代码语言:txt
复制
     A
      \
       B
        \
         C

其中A是祖父节点,B是父节点,C是新插入的节点。这是一个Zig-Zig情况,我们需要进行旋转操作来恢复平衡。具体操作如下:

  1. 对A进行左旋转,将B提升为新的根节点:
代码语言:txt
复制
       B
      / \
     A   C
  1. 对A进行右旋转,将B变为A的右子节点,C变为B的右子节点:
代码语言:txt
复制
       A
        \
         B
          \
           C

经过这两次旋转操作,AVL树恢复了平衡。

  1. Zig-Zag情况:当插入或删除导致某节点的两个子节点分别在该节点的不同侧时,出现Zig-Zag情况。在这种情况下,需要对父节点进行一次双旋转。

例如,假设我们插入了一个节点到AVL树的右子树的左子树中:

代码语言:txt
复制
     A
      \
       C
      /
     B

其中A是祖父节点,B是新插入的节点,C是父节点。这是一个Zig-Zag情况,我们需要进行旋转操作来恢复平衡。具体操作如下:

  1. 对C进行一次单旋转,将B提升为新的根节点:
代码语言:txt
复制
       A
        \
         B
          \
           C
  1. 对A进行一次单旋转,将B变为A的右子节点,C变为B的左子节点:
代码语言:txt
复制
       B
      / \
     A   C

经过这两次旋转操作,AVL树恢复了平衡。

根据以上的描述,可以看出AVL树的再平衡算法是根据节点的子节点的相对位置来进行判断和决策的。通过Zig-Zig和Zig-Zag情况的旋转操作,AVL树可以保持平衡性,并且在插入和删除操作之后维持较好的性能。

腾讯云相关产品和介绍链接地址:

  • 云计算服务:https://cloud.tencent.com/product
  • 云数据库 TencentDB:https://cloud.tencent.com/product/tcdb
  • 云服务器 CVM:https://cloud.tencent.com/product/cvm
  • 云原生应用引擎 TKE:https://cloud.tencent.com/product/tke
  • 音视频处理 VOD:https://cloud.tencent.com/product/vod
  • 人工智能 AI Lab:https://cloud.tencent.com/product/ailab
  • 物联网 IoV:https://cloud.tencent.com/product/iov
  • 移动开发服务 MSDK:https://cloud.tencent.com/product/msdk
  • 对象存储 COS:https://cloud.tencent.com/product/cos
  • 区块链 BaaS:https://cloud.tencent.com/product/baas
  • 云游戏解决方案 GPM:https://cloud.tencent.com/solution/game
  • 腾讯元宇宙:https://cloud.tencent.com/solution/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

纸上谈兵: 伸展 (splay tree)

我们讨论过,的搜索效率与的深度有关。二叉搜索的深度可能为n,这种情况下,每次搜索的复杂度为n的量级。AVL通过动态平衡的深度,单次搜索的复杂度为log(n) (以上参考纸上谈兵 AVL)。...这些操作的理念与AVL有些类似,即通过旋转,来改变树节点的分布,并减小树的深度。但伸展并没有AVL平衡要求,任意节点的左右子树可以相差任意深度。...zig 2. zig-zag: 当目标节点、父节点祖父节点成"zig-zag"构型时,进行一次双旋转,将目标节点调整到祖父节点的位置。 ?...zig-zag 3. zig-zig:当目标节点、父节点祖父节点成"zig-zig"构型时,进行一次zig-zig操作,将目标节点调整到祖父节点的位置。 ?...zig-zig 单旋转操作和双旋转操作见AVL。下面是zig-zig操作的示意图: ? zig-zig operation 在伸展中,zig-zig操作(基本上)取代了AVL中的单旋转。

714100

数据结构(7)-- Splay tree(伸展)

文章目录 前言 伸展 自底向上旋转 更进一步:展开 情况一:之字型(zig-zag情况二:一字型(zig-zig) 示例 伸展的节点删除 自顶向下伸展 zig(单旋转) zig-zig...作为栗子,考虑在下面的中对k1进行一次访问之后所发生的情况: 一次旋转之后: k1还没到根,继续转: 转,转: 好,转完了。 可以看到,本来一棵长变成了近乎平衡。...如果X的父节点是根节点,那么我们只需要旋转X树根。否则,X就有父亲§祖父(G),存在以上两种情况以及对称的情形要考虑(跟AVL差不多)。...情况一:之字型(zig-zag) 也就是AVL里那俩要双旋的。 情况二:一字型(zig-zig) 也就是AVL里那俩只需要单旋的。...zig-zig(一字型旋转) 在这种情况下,所查找的节点在Z的子树中,也就是,所查找的节点比XY都小。所以要将X,Y及其右子树都移动到右中。

89220
  • 伸展,据说比AVL要简单一些

    文章目录 预备知识 介绍伸展 伸展的基本想法是 一个简单的想法:自底向上旋转 更进一步:展开 情况一:之字型(zig-zag情况二:一字型(zig-zig) 示例 伸展的节点删除 自顶向下伸展...作为栗子,考虑在下面的中对k1进行一次访问之后所发生的情况: 相信大家都看过上面那篇AVL了,或者至少对AVL有一定的了解,这里就不过多介绍那些旋转方式。...一次旋转之后: k1还没到根,继续转: 转,转: 好,转完了。 可以看到,本来一棵长变成了近乎平衡。...如果X的父节点是根节点,那么我们只需要旋转X树根。否则,X就有父亲§祖父(G),存在以上两种情况以及对称的情形要考虑(跟AVL差不多)。...情况一:之字型(zig-zag) 也就是AVL里那俩要双旋的。 情况二:一字型(zig-zig) 也就是AVL里那俩只需要单旋的。

    1K30

    伸展的特性及实现

    除了AVL,本章将按照二叉搜索的介绍,继续介绍平衡二叉搜索家族中的另一个成员—Splay伸展。相对于AVL,Splay的实现更为简捷。...伸展无需时刻都严格地保持全平衡,但却能够在任何足够长的真实操作序列中,保持分摊意义上的高效率。...很遗憾,这一效率不仅远远低于AVL,而且甚至与原始的二叉搜索的最坏情况相当。而事实上,问题还远不止于此。稍做比对即不难发现,上图a与f中二叉搜索的结构完全相同。...主要以下分三类情况zig-zig/zag-zag如下图所示, 设v是p的左孩子,且p也是g的左孩子; 设WX分别是v的左、右子树,YZ分别是pg的右子树。?...zig-zag/zag-zig如下图所示,设v是p的左孩子,而p是g的右孩子; 设W是g的左子树,XY分别是v的左右子树,Z是p的右子树。?

    1K30

    【CPP】各种各样的(6)——自底向上的伸展

    昨(shang)天(zhou)结尾说到AVL的弊端,然后提到了伸展这个东西,那这次就来说说这个伸展的第一种实现,自底向上的伸展。...伸展能在O(log n)内完成插入、查找删除操作,由Daniel SleatorRobert Endre Tarjan在1985年发明。...上周说的AVL在每个操作的时候都要进行Fix操作,而且需要在每个结点保存height值来判断结点是否失衡,这都是非常耗费资源的想法,但是在实际中我们其实对每个结点的平衡并没有那么严格的要求,我们只希望的高度可以尽可能的小...先找到我们要访问的结点,然后往上寻找结点的两层父结点,若父结点与自己构成了之字形(Zig-Zag),我们进行普通的双旋转,若构成一字形(Zig-Zig),我们从上往下进行两次同方向单旋转,若只有一层父结点...想要更深入的理解可以像《数据结构与算法分析》中一样,先从32到1插入一棵长链,然后从1到10展开看各步的结果,可以很直观地看出展开操作对深度的改善效果。 ? ? ?

    51630

    伸展(splay tree)

    对于二叉查找而言,每次操作的最坏时间复杂度是O(N)。(当退化为链表的时候)。为了解决这个问题,我们给附加了一个平衡条件。平衡条件限制了任何节点的深度都不能过深。...其中一种限制条件是:一颗二叉查找的左子树右子树的高度差不能超过1,这个条件限制产生了AVL。 二叉查找的最坏操作是O(N)。但是这样的操作并不常见。...否则,X就有父节祖父,存在两种情形以及它们的对称(对于编程实现而言就是4种情形)情形。第一种情况是之字形(zig-zag),另一种情形是一字形(zig-zig)。...这个方式真是导致每次深度能降低一半的操作。我们在之字形的旋转过程中,AVL的双旋转并没有什么区别。不同之处在于,一字形的情形。这是这点不同导致了伸展的效果是很好的。...= NULL && T->right->left == P) { //先左旋 后右旋 即右双旋 T = DoubleTotateWithRight(T); } //第三种情况 zig-zig

    1.2K10

    手植这棵自顶向下伸展,何时亭亭盖呢?

    文章目录 前言 自顶向下原理图 说在前头 zig(单旋转) zig-zig(一字型旋转) zig-zag(之字型旋转) 合并 我一直没看懂的示例 自顶向下伸展代码实现 前言 伸展,解释起来真的很晕...2、左L保存小于X的节点。 3、右R保存大于X的节点。 开始时候,X是T的根,左右LR都是空的。 自底向上一样,自顶向下也分了三种情况。...zig-zig(一字型旋转) 在这种情况下,所查找的节点在Z的子树中,也就是,所查找的节点比XY都小。所以要将X,Y及其右子树都移动到右中。...首先是Y绕X右旋,然后Z绕Y右旋,最后将Z的右子树(此时Z的右子节点为Y)移动到右中。注意右中挂载点的位置。 zig-zag(之字型旋转) 在这种情况中,首先将Y右旋到根。...这样,在编程的时候就会简化,但是操作的数目增加(相当于两次Zig情况)。 合并 将中的左右子树分别连接到左的右子树的左子树上。将左右作为X的左右子树。重新最成了一所查找的节点为根的

    36620

    Java数据结构与算法解析(八)——伸展

    特性 1.普通的二叉查找相比,具有任何情况下、任何操作的平摊O(log2n)的复杂度,时间性能上更好 2.一般的平衡二叉比如 红黑AVL相比,维护更少的节点额外信息,空间性能更优,同时编程复杂度更低...3.在很多情况下,对于查找操作,后面的查询之前的查询有很大的相关性。...伸展的旋转有六种类型,如果去掉镜像的重复,则为三种:zig(zag)、zig-zig(zag-zag)、zig-zag(zag-zig)。...此时,先对y节点z节点进行zig旋转,然后对x节点y节点进行zig旋转,最后变为右图所示,x成为yz的祖先节点。...此时,先对x节点y节点进行zig旋转,将x及其右子树挂载到右R上,此时y成为中的根节点;然后对z节点y节点进行zag旋转,使得z成为中的根节点。

    35110

    【愚公系列】2023年11月 数据结构(九)-AVL

    堆分为最大堆最小堆,最大堆的每个节点的值都大于等于其子节点的值,最小堆则相反。图(Graph):是一种由节点边组成的非线性数据结构,它可以用来表示各种实体之间的关系,社交网络、路线图电路图等。...图的遍历最短路径算法是常见的图算法。一、AVL1.基本思想AVL的基本思想是通过对平衡因子进行调整,使得保持平衡。...3.5 旋转的选择AVL的旋转分为左旋右旋,旋转的目的是为了让AVL保持平衡。选择左旋还是右旋,需要根据的实际情况决定。...左旋的中心是该节点,旋转后将该节点的右子树左旋,使得该节点的右子树高度降低,左子树高度增加,达到平衡。需要注意的是,某些情况可能需要进行双旋转,即先左旋右旋或先右旋左旋,才能达到平衡。...在某些应用场景下(内存受限的环境)可能会受到限制。6.应用场景AVL可以应用于需要高效的数据插入查询的场景。

    20811

    (42) 排序二叉 计算机程序的思维逻辑

    何在中进行基本操作查找、遍历、插入删除呢?我们来看一下基本的算法。...满足这个平衡定义的排序二叉又被称为AVL,这个名字源于它的发明者G.M. Adelson-Velsky E.M....在TreeMap的实现中,用的并不是AVL,而是红黑,与AVL类似,红黑也是一种平衡的排序二叉,也是在插入删除节点时通过旋转操作来平衡的,但它并不是高度平衡的,而是大致平衡的,所谓大致是指,...对AVL红黑,它们保持平衡的细节都是比较复杂的,我们就不介绍了,我们需要知道的就是,它们都是排序二叉,都通过在插入删除时执行开销不大的旋转操作保持了的高度平衡或大致平衡,从而保证了的查找效率...基本的排序二叉不能保证平衡,可能退化为一个链表,有很多保持平衡算法AVL是第一个,能保证的高度平衡,但红黑是实际中使用更为广泛的,虽然只能保证大致平衡,但降低了维持平衡需要的开销,整体统计效果更好

    72660

    如果产品中需要压缩功能,我们应该如何选择压缩算法

    作者 | 段宽军 审校 | 蔡芳芳 看过很多压缩相关的技术文章,大家都在讲各种压缩算法的技术实现原理及各压缩算法之间的压缩率的对比,哪个压缩算法好等等。...本文将从另外一个大家讲的还比较少的角度,大家一起探讨下如何在产品中使用好压缩算法。 一、认识压缩算法 1 压缩算法的历史 压缩算法的历史,如同压缩算法一样,闪耀着神奇奥妙的光芒。...在不断提高压缩率的同时,压缩速度必然要跟着下降,使用者需要根据自己的实际应用情况,在两者间把握拿捏出一个好的平衡点来,达到既不会太影响业务处理速度,也可以收获一个好的压缩率的效果,从而节约存储空间。...我觉得这个需要在投入与收益之间找到一个平衡点。压缩算法的优化有这样的规律,前期投入 10 分的人力,能优化出 20 分的成绩,后期投入 10 分的人力,有可能只能优化出 5 分的成绩。...TDengine 中的压缩环节对整个产品而言还是比较重要的:一是使用频繁,读写查询都在不断调用;二是压缩率的大小决定了能给用户节约多少硬盘,直接关系着用户的存储成本;三是压缩算法性能决定着用户数据写入及查询的速度

    45620

    三分钟基础知识:什么是 2-3

    来源:五分钟学算法 作者:进击的HelloWorld 前面讲到了二叉搜索 (BST) 二叉平衡 (AVL) :【漫画】以后在有面试官问你AVL,你就把这篇文章扔给他。...如果想要减少比较次数,就需要降低的高度。在插入删除节点时,要保证插入节点后不能使叶子节点之间的深度之差大于 1,这样就能保证整棵的深度最小,这就是AVL 解决 BST 搜索性能降低的策略。...但由于每次插入或删除节点后,都可能会破坏 AVL平衡,而要动态保证 AVL平衡需要很多操作,这些操作会影响整个数据结构的性能,除非是在的结构变化特别少的情形下,否则 AVL 平衡带来的搜索性能提升有可能还不足为了平衡所带来的性能损耗...(4)所有叶子点都在的同一层。 2-3查找 2-3 的查找类似二叉搜索的查找过程,根据键值的比较来决定查找的方向。 例如在图 2.1 所示的 2-3 中查找键为H的节点: ?...但是2-3需要维护两种不同类型的结点,查找插入操作的实现需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找更慢。

    68720

    【C++高阶】掌握AVL:构建与维护平衡二叉搜索的艺术

    它需要我们深入理解其背后的数学原理算法思想,掌握其插入、旋转等操作的具体实现,并在实践中不断摸索优化。...,先对30进行左单旋,然后对90进行右单旋,旋转完成后考虑平衡因子的更新 这里单旋可以复用上面讲的 AVL左右双旋示例(C++): void RotateLR(Node* parent) {...维护成本高 由于AVL要求每个节点的左右子树高度差不超过1,因此需要频繁地检查调整的结构。这种严格的平衡要求导致了相对较高的维护成本,特别是在频繁进行插入删除操作的情况下。...我们学会了如何在插入删除操作中通过旋转操作来保持平衡,这种动态调整的思想在软件开发中同样具有广泛的应用 AVL的学习之旅虽然告一段落,但我们对数据结构算法的探索永无止境。...在未来的学习工作中,我们将会遇到更多复杂的问题挑战,但只要我们保持对知识的渴望对问题的深入思考,就一定能够找到解决问题的钥匙 让我们以AVL为起点,继续在数据结构算法的海洋中遨游,不断挖掘计算机科学的奥秘

    18810

    数据结构与算法——2-3

    前言 前面讲到了二叉搜索 (BST) 二叉平衡 (AVL) ,二叉搜索在最好的情况下搜索的时间复杂度为 O(logn) ,但如果插入节点时,插入元素序列本身就是有序的,那么BST就退化成一个线性表了...如果想要减少比较次数,就需要降低的高度。在插入删除节点时,要保证插入节点后不能使叶子节点之间的深度之差大于 1,这样就能保证整棵的深度最小,这就是AVL 解决 BST 搜索性能降低的策略。...但由于每次插入或删除节点后,都可能会破坏 AVL平衡,而要动态保证 AVL平衡需要很多操作,这些操作会影响整个数据结构的性能,除非是在的结构变化特别少的情形下,否则 AVL 平衡带来的搜索性能提升有可能还不足为了平衡所带来的性能损耗...(4)所有叶子点都在的同一层。 2-3查找 2-3 的查找类似二叉搜索的查找过程,根据键值的比较来决定查找的方向。 例如在图 2.1 所示的 2-3 中查找键为H的节点: ?...但是2-3需要维护两种不同类型的结点,查找插入操作的实现需要大量的代码,而且它们所产生的额外开销可能会使算法比标准的二叉查找更慢。 今日问题: 大家的开工状态怎么样? ?

    66010

    Mysql中的索引

    3.优化sql:决定使用哪个索引,或者多表进行关联的时候决定表的链接顺序。接着生成执行计划。...平衡二叉平衡二叉的对比 3 当不平衡时,则需要调整二叉平衡。...总的来说,红黑的统计性能高于AVL。 因此在实际中AVL使用相对比较少,而红黑使用非常广泛。Java中的TreeMap使用红黑存储排序键值对。...Java8中的HashMap使用链表+红黑解决哈希冲突问题(当冲突比较少的时候,使用链表,当冲突多的时候采用红黑) 在数据内存中的情况(如上述的TreeMapHashMap),红黑的表现是非常好的...但是对于数据在磁盘等辅助存储的设备情况中(:Mysql数据库),红黑并不适用,因为红黑相对很高。

    3.3K20

    整理得吐血了,二叉、红黑、B&B+超齐全,快速搞定数据结构

    因此,如果应用程序涉及许多频繁的插入删除操作,则应首选Red Black( Java 1.8中的HashMap)。如果插入删除操作的频率较低,而搜索操作的频率较高,则AVL应优先于红黑。...B-Tree(B) 大多数自平衡搜索AVL红黑)都会假定所有数据都在主内存中,但我们必须考虑无法容纳在主内存中的大量数据。...由于B的高度较低,因此与平衡的二叉搜索AVL、红黑等)相比,大多数操作的磁盘访问次数显著减少。...m/2个子节点 节点的子节点数等于节点的key数加1 节点的所有key都按键值升序排序,两个键k1k2之间的子key包含k1k2范围内的所有键 与其他平衡二叉搜索一样,搜索、插入删除的时间复杂度为...B-Tree缘由:大多数自平衡搜索AVL红黑)都会假定所有数据都在主内存中,但我们必须考虑无法容纳在主内存中的大量数据。

    2.9K20

    数据结构之

    原因在于插入删除元素的时候,没有保持平衡(我们需要进行n次查找操作),导致退化成线性存储结构。我们追求的是在最坏的情况下仍然有较好的时间复杂度,这就是平衡查找设计的初衷。...平衡二叉的定义: 平衡二叉(Balanced Binary Tree)又被称为AVL(有别于AVL算法),且具有以下性质:它是一 棵空或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉...平衡二叉的常用算法有红黑AVL等。在平衡二叉搜索中,我们可以看到,其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度。 AVL AVL是最先发明的自平衡二叉查 找。...在AVL中任何节点的两个儿子子树的高度最大差别为一,所以它也被称为高度平衡。查找、插入删除在平均最坏情况下都是O(log n)。增加删除可能需要通过一次或多次旋转来重新平衡这个。...AVL vs 红黑 (1)AVL的检索效率高于红黑 (2)红黑的删除插入的效率高于AVL 红黑以部分平衡的实现,牺牲了微弱的检索性能,但换来了删除插入的性能 堆 堆(英语:Heap)是计算机科学中的一种特别的树状数据结构

    83320

    什么是平衡二叉AVL

    查找、插入删除在平均最坏情况下的时间复杂度都是O(logn)。增加删除元素的操作则可能需要借由一次或多次旋转,以实现的重新平衡AVL 得名于它的发明者 G. M....由前苏联的数学家 Adelse-Velskil Landis 在 1962 年提出的高度平衡的二叉,根据科学家的英文名也称为 AVL 。它具有如下几个性质: 可以是空。...AVL的四种插入节点方式 假设一颗 AVL 的某个节点为 A,有四种操作会使 A 的左右子树高度差大于 1,从而破坏了原有 AVL 平衡性。平衡二叉插入节点的情况分为以下四种: ?... LR 型最后的根结点为原来的根的左孩子的右孩子,RL 型最后的根结点为原来的根的右孩子的左孩子。只要记住这四种情况,可以很快地推导出所有的情况。 维护平衡二叉,最麻烦的地方在于平衡因子的维护。...AVL的四种删除节点方式 AVL 二叉查找的删除操作情况一致,都分为四种情况: (1)删除叶子节点 (2)删除的节点只有左子树 (3)删除的节点只有右子树 (4)删除的节点既有左子树又有右子树

    69920

    详述 MySQL 中 InnoDB 的索引结构以及使用 B+ 实现索引的原因

    聚簇索引整体是一个 B+ ,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接的,上文说到 B+ 是一棵平衡查找...平衡二叉:旋转耗时 平衡二叉AVL,Adelson-Velsky-Landis Tree),AVL 是严格的平衡二叉,所有节点的左右子树高度差不能超过 1;AVL 查找、插入删除在平均最坏情况下都是...AVL 实现平衡的关键在于旋转操作:插入删除可能破坏二叉平衡,此时需要通过一次或多次旋转来重新平衡这个。...但是对于数据在磁盘等辅助存储设备中的情况 MySQL 等数据库),红黑并不擅长,因为红黑长得还是太高了。...平衡二叉、B、B+、B* 理解其中一种你就都明白了 深入理解MySQL索引底层数据结构与算法

    1K10

    图解:数据结构中的6种「」,大鹏问你心中有数吗?

    定义 AVL 是一种平衡二叉查找,二叉查找我们已经知道,那平衡是什么意思呢? 我们举个天平的例子,天平两端的重量要差不多才能平衡,否则就会出现向一边倾斜的情况。...保持平衡的目的是可以控制查找、插入删除在平均最坏情况下的时间复杂度都是O(log n),相比普通二叉最坏情况的时间复杂度是 O(n) ,AVL把最坏情况的复杂度控制在可接受范围,非常合适对算法执行时间敏感类的应用...红黑 而节点的路径长度决定着对节点的查询效率,这样我们确保了,最坏情况下的查找、插入、删除操作的时间复杂度不超过O(log n),并且有较高的插入删除效率。...红黑 VS 平衡二叉AVL) 插入删除操作,一般认为红黑的删除插入会比 AVL 更快。...因为 AVL 设计比红黑更加平衡,不会出现平衡因子超过 1 的情况,减少了的平均搜索长度。

    1.3K51
    领券