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

数据结构——AVL树(C语言)

AVL(Adelson-Velskii 和 Landis)树是带有平衡条件的二叉查找树。在计算机科学中,AVL树是最先发明的自平衡二叉查找树。...在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(lngn)。...增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或-1的结点被认为是平衡的。...AVL树的基本操作一般涉及运作同在不平衡的二叉查找树所运作的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL旋转"。 以下图标表示的四种情况,就是AVL旋转中常见的四种。...下面来看AVL树的操作有哪些: #ifndef _AvlTree_H struct AvlNode; typedef struct AvlNode *Position; typedef struct

1K21

数据结构——AVL树(C语言)

AVL(Adelson-Velskii 和 Landis)树是带有平衡条件的二叉查找树。在计算机科学中,AVL树是最先发明的自平衡二叉查找树。...在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(lngn)。...增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或-1的结点被认为是平衡的。...AVL树的基本操作一般涉及运作同在不平衡的二叉查找树所运作的同样的算法。但是要进行预先或随后做一次或多次所谓的"AVL旋转"。 以下图标表示的四种情况,就是AVL旋转中常见的四种。...下面来看AVL树的操作有哪些: #ifndef _AvlTree_H struct AvlNode; typedef struct AvlNode *Position; typedef struct

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

    AVL树(Java语言)

    平衡二叉树 平衡二叉树也叫平衡二叉查找树,又被称为AVL树,可以保证查询效率较高。它的特点是:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。...显然,对一棵AVL树而言,其所有结点的平衡因子只能是-1,0,1.挡在一棵AVL树上插入一个结点时,有可能导致失衡,即出现绝对值大于1的平衡因子。...return 0; } else { return right.height(); } } //返回以该节点为根节点的树的高度...(avl.root.leftHeight()); System.out.println(avl.root.rightHeight()); } } 二叉排序树的运行结果:...AVL树的运行结果: 从以上两个运行结果可以看出:树的高度、树的左、右子树高度经过处理后,原来的二叉排序树变为了一棵AVL树。

    42120

    C++AVL树

    AVL树 零、前言 一、AVL树的概念 二、AVL树结点定义 三、AVL树的插入 四、AVL树的旋转 1、左单旋 2、右单旋 3、左右双旋 4、右左双旋 5、总结 五、AVL树的验证 六、AVL树的性能...零、前言 本章主要讲解map和set的底层结构平衡二叉搜索树的一种-AVL树的特性及其实现 一、AVL树的概念 引入: map/multimap/set/multiset其底层都是按照二叉搜索树来实现的...树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树 那么AVL树的插入过程: 首先按照二叉搜索树的方式插入新节点 待插入结点的key值比当前结点小就插入到该结点的左子树...对于a,b,c都是符合AVL树且高度为h的树的一种,这里不具体表示,以抽象表示各种情况,对于以下抽象图示也是如此 在旋转过程中,有以下几种情况需要考虑: 60节点的左孩子可能存在,也可能不存在...,不需要再向上更新 五、AVL树的验证 AVL树是在二叉搜索树的基础上加入了平衡性的限制 要验证AVL树可以分两步: 验证其为二叉搜索树 如果中序遍历可得到一个有序的序列,就说明为二叉搜索树

    43250

    【C++】AVL树

    一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的,它就是 AVL...K和V详情参考:二叉搜索树 2.插入 AVL 树就是在二叉搜索树的基础上引入了平衡因子,因此 AVL 树也可以看成是二叉搜索树。...那么 AVL 树的插入过程可以分为两步: 按照二叉搜索树的方式插入新节点 调整节点的平衡因子 插入节点的方法和我们前文讲到的二叉搜索树插入方法一致,我们在此就不重复叙述了。...但是如果要对AVL树做一些结构修改的操 作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时, 有可能一直要让旋转持续到根的位置。...因此:如果需要一种查询高效且有序的数据结构,而且数 据的个数为静态的(即不会改变),可以考虑AVL树,但一个结构经常修改,就不太适合。

    31030

    【C++】AVL树

    AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的二叉搜索树:它的 左右⼦树都是AV树,且左右⼦树的⾼度差的绝对值不超过1。...AVL树是⼀颗⾼度平衡搜索二叉树, 通过控制⾼度差去控制平衡。 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M....2.3.2右单旋 • 本图1展⽰的是10为根的树,有a/b/c抽象为三棵⾼度为h的⼦树(h>=0),a/b/c均符合AVL树的要 求。...10为根的树,有a/b/c抽象为三棵⾼度为h的⼦树(h>=0),a/b/c均符合AVL树的要 求。...图7和图8分别为左右双旋中h==0和h==1具体场景分析,下⾯我们将a/b/c⼦树抽象为⾼度h的AVL ⼦树进⾏分析,另外我们需要把b⼦树的细节进⼀步展开为8和左⼦树⾼度为h-1的e和f⼦树,因为

    10110

    C++【AVL树】

    树就属于其中一种比较经典的平衡二叉搜索树,它是通过 平衡因子 的方式来降低二叉树高度的,具体怎么操作,可以接着往下看 ---- ️正文 1、认识AVL树 AVL 树由 前苏联 的两位数学家:G.M.Adelson-Velskii...1 那么它就是一棵 AVL 树 注意: AVL 树是一棵高度平衡的二叉搜索树,如果它有 N 个节点,那么它的高度可以保持在 logN 左右,时间复杂度为 O(logN) 1.1、AVL树的定义 AVL...树在原 二叉搜索树 的基础上添加了 平衡因子 bf 以及用于快速向上调整的 父亲指针 parent,所以 AVL 树是一个三叉链结构 所以 AVL 树的节点通过代码定义如下: //AVL树的节点类(...+ 的容量 AVL 树是一棵十分自律的树,即使在数据量如此之大的情况下,也能很好的控制高度 3.3、AVL树的性能 AVL 树是一棵 绝对平衡 的二叉树,对高度的控制极为苛刻,稍微有点退化的趋势,都要被旋转调整...C++【AVL树】的全部内容了,在本文中,我们首先了解了什么是 AVL 树,然后对其进行了实现,AVL 树光是一个 插入 操作,就已经涉及了 四大旋转情况,其中每种情况都需要自己画图分析,AVL 树是存储静态数据的理想容器

    15120

    C++: AVL树

    一棵AVL树或者是空树, 或者是具有以下性质的二叉搜素树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的,它就是AVL树...AVL树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。...那么AVL树的插入过程可以分为两步: 按照二叉搜索树的方式插入新节点 调整节点的平衡因子 // 1. 先按照二叉搜索树的规则将节点插入到AVL树中 // 2....AVL树的删除(了解) 因为AVL树也是二叉搜索树,可按照二叉搜索树的方式将节点删除,然后再更新平衡因子,只不错与删除不同的时,删除节点后的平衡因子更新,最差情况下一直要调整到根节点的位置。...AVL树的性能 AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度,即 log_2 (N) 。

    10710

    C++:AVL树

    AVL树,即是高度平衡的二叉搜索树。 一棵AVL树是一棵平衡二叉搜索树,也能是一棵空树。...AVL树的性质: ①它的左右子树都是AVL树 ②左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) ③如果一棵二叉搜索树是高度平衡的,它就是AVL树。...如果它有n个结点,其高度可保持在log_2N,搜索的时间复杂度是log_2N。  AVL树的定义: AVL树的定义中:①拥有键值对。②多加一个双亲节点,用于调整平衡二叉树。...树的插入 AVL树的插入分成两步:第一步是按照二叉搜索树的方式来新增节点。...验证AVL树 由于AVL树是在二叉搜索树的基础上加了平衡性后得到的树,因此需要确认一棵树是AVL树,那么就需要以下两步: 1.先确定是否是一棵二叉搜索树:如果中序遍历可得到一个有序的序列,就说明为二叉搜索树

    38430

    【c++】AVL树

    目录 1.AVL树的介绍 2.构建AVL树 2.1节点构建 2.2 AVL树的插入 2.3AVL树的旋转 左左:右单旋 右右:左单旋 左右:先左单旋再右单旋 右左:先右单旋再左单旋 完善插入函数: 2.4...其他函数 1.AVL树的介绍 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下 当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过...1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差==(简称平衡因子)的绝对值不超过...意味着插入不改变高度,就不改变祖辈的平衡因子 如果平衡因子等于二了,就需要进行旋转,后面进行讲解 2.构建AVL树 2.1节点构建 template struct AVLTreeNode...树的旋转 左左:右单旋 新节点插入较高左子树的左侧,我们进行右单旋 30c,我们在这里调节位置关系,调节后平衡因子均为0 void RotateR(Node*parent) { Node

    6800

    C++:AVL树

    AVL树概念 AVL树是一种具有特殊性质的二叉搜索树,AVL树的左右子树也都是AVL树,且左右子树的高度差的绝对值不超过1,超过1就说明AVL树失衡,需要调整。...AVL树的实现 AVL树的节点 由于在调整失衡的AVL树时,需要频繁访问父节点,所以我们在定义节点时也需要引入parent指针。...树的插入 向AVL树插入新节点的过程与二叉搜索树的插入类似,但有区别的是,插入新节点后需要更新平衡因子,然后根据平衡因子的情况判断AVL树是否失衡,失衡就对AVL树进行调整。...} return true; } private: Node* _root = nullptr;; }; AVL树的平衡调整 AVL树的调整其实就是对失衡的AVl树进行旋转操作,旋转操作必须保持搜索树的规则...树的查找 AVL树的查找与二叉搜索树是一摸一样的。

    13010

    【C++】AVL树

    一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 平衡因子并不是必须的,只是它的一种实现方式。...AVL树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。...h==1: 在20的左边或者右边新增都会引发旋转 h==2 高度为2的AVL树有三种: b和c是x/y/z中的任意一种 a只能是z这种情况,如果a是x这种情况: 那么当a插入一个节点...根据节点插入位置的不同,AVL树的旋转分为四种: 新节点插入较高左子树的左侧—左左:右单旋(左边高,往右边压) b变成60的左边,30c子树 所以当h==1时候,也是同样的右边压...AVL树的验证 AVL树是在二叉搜索树的基础上加入了平衡性的限制,因此要验证AVL树,可以分两步: 验证其为二叉搜索树 如果中序遍历可得到一个有序的序列,就说明为二叉搜索树 验证其为平衡树 (1)每个节点子树高度差的绝对值不超过

    9810

    C++——AVL树

    一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 右子树高度-左子树高度=平衡因子 这棵树是平衡的...节点定义 对于AVL树结点的定义,不仅仅多了一个平衡因子,还多了一个父节点的指针,是一个三叉链的结构。...树的根节点 }; 旋转 旋转的目的; 1.让这棵树的左右树高度差不超过1 2.旋转之后也要保持这棵树是AVL树 3.更新调节平衡因子 4.旋转后的高度要和插入前相同 左单旋与右单旋 左单旋:...验证AVL树 这里还需要加一个平衡因子的判断; int _Height(Node* root)//计算树的高度 { if (root == nullptr) return 0; int...l + 1 : r + 1;//返回左子树和右子树最高高度 } bool _IsBalanceTree(Node* root) { if (root == nullptr)//空树也是AVL树

    25120

    【C++】AVL树

    AVL树 一、AVL树概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。...一棵 AVL树 或者是 空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子,等于右子树高度 - 左子树高度)的绝对值不超过1(-1/0/1) 如下是一颗 AVL...AVL树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。...当新插入节点在较高右子树的右侧,即在 c 子树的位置插入;以上这个图叫做抽象图,因为情况太多了画不完,所以用抽象图表示更为直观;要在 c 子树插入引起旋转,那么 c 一定为高度为 h 的满AVL树或者空树...AVL树的验证 AVL树是在二叉搜索树的基础上加入了平衡性的限制,因此要验证AVL树,可以分两步: 验证其为二叉搜索树 如果中序遍历可得到一个有序的序列,就说明为二叉搜索树 验证其为平衡树 每个节点子树高度差的绝对值不超过

    12610

    C++实现AVL树

    1.AVL树 AVL树是具有以下性质的二叉搜索树: 1.它的左右子树都是AVL树 2.左右子树高度之差(简称平衡因子)的绝对值不超过1. 如果一颗二叉搜索树是高度平衡的。那么它就是AVL树。...树的插入 AVL树的插入可以说是AVL树最重要的内容,不过因为AVL树是再二叉平衡树的基础上加入了平衡因子,所以最开始的插入操作和二叉平衡树是相同的。...树中插入的基础结构,先进行的二叉搜索树中的插入操作,然后在节点插入过后,因为AVL树的平衡性可能会改变,所以我们要开始对树进行处理。...如果pParent的平衡因子为正负2,则pParent的平衡因子违反平衡树的性质,需要对其进行旋转处理 2.2.1.AVL树的旋转 如果在一颗原本平衡的AVL树中插入一个新的节点,造成了AVL树的不平衡...为此我们还要写一个验证AVL树的函数。 我们都知道,AVL树一定也是二叉搜索树,所以如果中序打印出来不是一个有序的数组那么一定出问题了。验证完二叉搜索树后就是验证其为AVL树。

    8910

    C++之AVL树

    因此map、set等关联式容器的底层结构是对搜索二叉树进行平衡处理的平衡二叉搜索树。 本节我们就来了解平衡搜索二叉树AVL树的相关概念。...一棵AVL树要具有以下性质: 该树如果是空树,那么它是AVL树; 它的左右子树是AVL树; 左右子树的高度差(命名为平衡因子)的绝对值不超过1(可以是1/0/-1) 上图的红色标识的是该结点的平衡因子...树的插入 实际上,AVL树就是在二叉搜索树的基础上增加了平衡因子,因此AVL树的插入可以分为两步: 按照二叉搜索树的插入方式插入新结点 调整结点的平衡因子 bool insert(const pair...AVL树" << endl; else cout 树是AVL树" << endl; return 0; } 8.性能 AVL树是一棵绝对平衡的搜索二叉树,它要求每个结点的左右子树的高度差的绝对值不超过...总结 以上就是今天要讲的内容,本文介绍了C++中的AVL树的相关概念。

    82450

    【C++学习篇】AVL树

    1.AVL树的概念 1. AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AV树,且左右⼦树的⾼度差的绝对值不超过1。...本图1展⽰的是10为根的树,有a/b/c抽象为三棵⾼度为h的⼦树(h>=0),a/b/c均符合AVL树的要求。10可能是整棵树的根,也可能是⼀个整棵树中局部的⼦树的根。...本图6展⽰的是10为根的树,有a/b/c抽象为三棵⾼度为h的⼦树(h>=0),a/b/c均符合AVL树的要求。10可能是整棵树的根,也可能是⼀个整棵树中局部的⼦树的根。...图7和图8分别为左右双旋中h==0和h==1具体场景分析,下⾯我们将a/b/c⼦树抽象为⾼度h的AVL⼦树进⾏分析,另外我们需要把b⼦树的细节进⼀步展开为8和左⼦树⾼度为h-1的e和f⼦树,因为 我们要对...2.3.4 右左双旋 跟左右双旋类似,下⾯我们将a/b/c⼦树抽象为⾼度h的AVL⼦树进⾏分析,另外我们需要把b⼦树的细节进⼀步展开为12和左⼦树⾼度为h-1的e和f⼦树,因为我们要对b的⽗亲15为旋转点进

    8910

    【C++】AVL树和红黑树的插入

    ---- 一、AVL树 1.AVL树的介绍 1....在新增结点之前,这棵树必须得是AVL树或AVL子树,在插入构建AVL树的过程中我们处理的就是非AVL树的情况,所以在新增结点之前,子树一定是AVL树,所以如果9是新增结点的话,那么8的左边就一定是空,这样才会引发平衡因子异常...写完AVL树之后,我们还需要写一个程序对AVL树进行验证,要不然你说你的树是AVL树他就是AVL树啊!万一你写错了呢?所以写完AVL树的插入之后,还需要再对其进行验证,看是否满足AVL树的条件。...红黑树有5条重要的性质,但最有用的就是其中的第c和d条。 a.红黑树的节点不是红色就是黑色 b.红黑树的根节点必须是黑色 c.红黑树从当前根节点到每条路径上的黑色节点数量都相同。...所以红黑树的搜索效率和AVL树可以近似看作相等,但是红黑树不需要那么多的旋转来调平衡,因为红黑树可以允许最长路径是最短路径的2倍,他的要求并没有AVL树那么严格,所以红黑树的旋转次数要比AVL树少很多,

    66820

    初识C++ · AVL树(2)

    前言: AVL树作为一种结构,理解树的本身是不大难的,难的在于,树旋转之后的连接问题,写AVL树的代码大部分都是在旋转部分,所以连接问题是比较需要细心的,那么这里来说呢,把细心做好,变量的位置放好,连接的次序连接对...,树还是没有平衡,那么我们再左旋,相当于旋转回来了,整个树的结果是没有变的。...选择b c作为例子,当我们往b c插入数据的时候,90的平衡因子变为了-2,此时parent就是90,那么我们需要一个操作让该树变成完全的左子树高,这样再右旋转,才可以保持平衡,那么如何变成完全的左子树高呢...旋转的问题很好解决,旋转中的问题可不止旋转,这里还有平衡因子的问题,我们不难发现,在b 或者 c插入数据之后平衡因子的改变不是一样的,甚至来说如果h = 1,即60是新插入的,平衡因子的改变也是不一样的...树的查找实在太快,但是对于平衡因子的控制要求太严格了,所以红黑树出现了,红黑树是一种近似平衡的结构~ 感谢阅读!

    5510

    【C++】模拟实现AVL树

    一.了解项目功能 在本次项目中我们的目标是实现一个AVL树 : 提供的功能有: AVL树结点类的构造函数 AVL树的构造函数 AVL树的插入函数 插入时结点的左单旋 插入时结点的右单旋 插入时结点的左右双旋...该部分功能实现代码如下: //贴代码 三.项目完整代码 我们将程序运行的代码分别在三个工程文件中编辑,完整代码如下: test.c文件 #include"AVL_Tree.h" int main()...: //当你变为0时,你上一步的操作一定没有影响到你这整颗树的总高度,你的总高度不变,你就不会影响父节点的平衡因子 if (parent->_bf == 0) { break...parent; parent = parent->_parent; } else if (parent->_bf == 2 || parent->_bf == -2) { //树出现了失衡结点...,考虑旋转,使树重新平衡 if (parent->_bf == 2 && cur->_bf == 1)//右-左为正,说明单纯右高,那就左单旋 { //左单旋 RotateL

    9610
    领券