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

带有迭代插入的C语言AVL树

是一种自平衡的二叉搜索树,它通过在插入操作时进行旋转和调整来保持树的平衡。AVL树的名称来自于其发明者Adelson-Velsky和Landis。

AVL树的主要特点是每个节点都有一个平衡因子,即左子树的高度减去右子树的高度。平衡因子可以是-1、0或1,当平衡因子超过这个范围时,就需要进行旋转和调整来恢复树的平衡。

迭代插入是指在插入新节点时使用循环而不是递归的方式。以下是一个带有迭代插入的C语言AVL树的示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// AVL树节点结构
struct Node {
    int key;
    struct Node* left;
    struct Node* right;
    int height;
};

// 获取节点的高度
int getHeight(struct Node* node) {
    if (node == NULL)
        return 0;
    return node->height;
}

// 获取两个数中较大的数
int max(int a, int b) {
    return (a > b) ? a : b;
}

// 创建一个新节点
struct Node* createNode(int key) {
    struct Node* node = (struct Node*)malloc(sizeof(struct Node));
    node->key = key;
    node->left = NULL;
    node->right = NULL;
    node->height = 1;
    return node;
}

// 右旋操作
struct Node* rightRotate(struct Node* y) {
    struct Node* x = y->left;
    struct Node* T2 = x->right;

    x->right = y;
    y->left = T2;

    y->height = max(getHeight(y->left), getHeight(y->right)) + 1;
    x->height = max(getHeight(x->left), getHeight(x->right)) + 1;

    return x;
}

// 左旋操作
struct Node* leftRotate(struct Node* x) {
    struct Node* y = x->right;
    struct Node* T2 = y->left;

    y->left = x;
    x->right = T2;

    x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
    y->height = max(getHeight(y->left), getHeight(y->right)) + 1;

    return y;
}

// 获取平衡因子
int getBalanceFactor(struct Node* node) {
    if (node == NULL)
        return 0;
    return getHeight(node->left) - getHeight(node->right);
}

// 插入节点
struct Node* insertNode(struct Node* node, int key) {
    // 执行标准的BST插入
    if (node == NULL)
        return createNode(key);

    if (key < node->key)
        node->left = insertNode(node->left, key);
    else if (key > node->key)
        node->right = insertNode(node->right, key);
    else
        return node; // 不允许插入重复的节点

    // 更新节点的高度
    node->height = 1 + max(getHeight(node->left), getHeight(node->right));

    // 获取节点的平衡因子
    int balanceFactor = getBalanceFactor(node);

    // 如果节点不平衡,根据平衡因子进行旋转和调整
    if (balanceFactor > 1) {
        if (key < node->left->key) {
            // 左左情况,进行右旋
            return rightRotate(node);
        } else if (key > node->left->key) {
            // 左右情况,先左旋再右旋
            node->left = leftRotate(node->left);
            return rightRotate(node);
        }
    }

    if (balanceFactor < -1) {
        if (key > node->right->key) {
            // 右右情况,进行左旋
            return leftRotate(node);
        } else if (key < node->right->key) {
            // 右左情况,先右旋再左旋
            node->right = rightRotate(node->right);
            return leftRotate(node);
        }
    }

    return node;
}

// 中序遍历AVL树
void inorderTraversal(struct Node* root) {
    if (root != NULL) {
        inorderTraversal(root->left);
        printf("%d ", root->key);
        inorderTraversal(root->right);
    }
}

// 主函数
int main() {
    struct Node* root = NULL;

    // 插入节点
    root = insertNode(root, 10);
    root = insertNode(root, 20);
    root = insertNode(root, 30);
    root = insertNode(root, 40);
    root = insertNode(root, 50);
    root = insertNode(root, 25);

    // 中序遍历AVL树
    printf("AVL树中序遍历结果:");
    inorderTraversal(root);

    return 0;
}

这段代码实现了一个带有迭代插入的AVL树,它可以插入新节点并保持树的平衡。在主函数中,我们插入了一些节点并进行了中序遍历,以验证树的正确性。

AVL树的优势在于它可以在插入和删除节点时自动保持树的平衡,从而提供较快的搜索、插入和删除操作。它适用于需要频繁进行这些操作的场景,例如数据库索引、字典等。

腾讯云提供了多个与云计算相关的产品,其中包括云服务器、云数据库、云存储、人工智能等。具体推荐的腾讯云产品和产品介绍链接地址可以根据实际需求进行选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

AVL树插入的步骤共分为3步,第一步和搜索树规则相同,还是迭代找到插入结点的位置,进行结点的插入。...迭代找插入结点位置进行插入我就不讲解了,如果有不懂的,可以去看前面二叉搜索树那一节的文章,在这里我先来讲一讲更新平衡因子的过程。...写完AVL树之后,我们还需要写一个程序对AVL树进行验证,要不然你说你的树是AVL树他就是AVL树啊!万一你写错了呢?所以写完AVL树的插入之后,还需要再对其进行验证,看是否满足AVL树的条件。...其实就是因为AVL树的规则过于严苛,导致稍微插入一些结点就有可能违反了AVL树的规则,我们就需要通过旋转调平衡进行处理,但旋转调平衡是有代价的啊,如果插入结点就调平衡,插入节点就调平衡,自然AVL树的效率就下来了...红黑树有5条重要的性质,但最有用的就是其中的第c和d条。 a.红黑树的节点不是红色就是黑色 b.红黑树的根节点必须是黑色 c.红黑树从当前根节点到每条路径上的黑色节点数量都相同。

66820

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

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

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

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

    1.1K21

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

    1.AVL树概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下, 所以在此基础上提出解决办法: 当向二叉搜索树中插入新节结点时...,如果能保证每个节点的左右子树高度之差的绝对值不超过1即可降低树的高度,从而减少平均搜索长度 AVL树又称平衡二叉搜索树 2....AVL树性质 AVL树的性质: 1.它的左右子树都是AVL树 2.左右子树高度之差(平衡因子)的绝对值不超过1(1/0/-1) 平衡因子=右子树高度-左子树高度 3.AVL树的实现 在实现结构与插入功能时...60的左子树,将60作为90的左子树 ---- 将60进行右旋:60作为整棵树新的根 将60的右子树作为90的左子树,将90作为60的右子树 ---- 假设在c的右子树插入新增节点 新增节点插入在...插入引发双旋的场景 1.h==2时,c插入,c的高度变化为h 刚开始60的平衡因子为1 ---- 2..h==2时,b插入,b的高度变化为h 刚开始60的平衡因子为-1 ---- 3. h==

    20530

    【数据结构与算法】AVL树的插入与删除实现详解

    AVL树的插入Insert 一、节点的插入 ​ AVL 树的插入和之前搜索树的插入是一样的,只不过在插入之后,我们需要做出调整,因为有可能我们插入节点后会导致二叉树的不平衡,所以我们得重新调整高度!...AVL 树的插入过程可以分为两步: 按照二叉搜索树的方式插入新节点 调整节点的平衡因子 新增的节点如果在 parent 的左边,则 parent->bf-- 新增的节点如果在 parent...二、插入的旋转 ​ 如果在一棵原本是平衡的 AVL 树中插入一个新节点,可能造成不平衡,此时必须调整树的结构,使之平衡化。...上图在插入前,AVL 树是平衡的,新节点插入到 30 的左子树(注意:此处不是左孩子)中,30 的左子树增加了一层,导致以 60 为根的二叉树不平衡,要让 60 平衡,只能将 60 左子树的高度减少一层...AVL树的删除Erase 一、节点的删除 ​ 因为 AVL 树也是二叉搜索树,可按照二叉搜索树的方式将节点删除,然后再更新平衡因子,只不过与插入不同的是,删除节点后的平衡因子更新,最差情况下一直要调整到根节点的位置

    8200

    【C++进阶】AVL树的模拟实现(附源码)

    一.AVL树的概念 我们知道,二叉搜索树的效率很高,如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下,为了解决这个问题,AVL树(平衡二叉树)就出现了。...AVL树的性质: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)(右子树-左子树) 上图就是一个AVL树,每个节点上的数字为这个节点的平衡因子,绝对值不超过1...; 如果一棵二叉搜索树是高度平衡的,它就是AVL树。...树的插入 Insert 首先就是找到新插入节点的位置,这和二叉搜索树的操作是一样的,插入完成后,不要忘记更新cur的parent指针。...树的性能 AVL树是一棵绝对平衡的二叉搜索树,其要求每个节点的左右子树高度差的绝对值都不超过1,这样可以保证查询时高效的时间复杂度,即logN 但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如

    18810

    平衡二叉树 AVL 的插入节点后旋转方法分析

    平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。...注:AVL 树也是一种二叉查找树,故删除策略可以参照前面文章来实现,只是删除节点后,如果平衡被打破,则也需要进行旋转以保持平衡。...很明显B或者C的插入使得k3(A)不平衡了,那么首先应该是k1和k2逆时针旋转,所以调用 k3->left = singlerotateRR(k3->left); 接着是k3和new child 顺时针旋转...注意:输入数组元素就不要搞成有序的了,如果代码中没有调整的实现,整个树就是个右斜树,但即使实现了调整,也会使得每插入一次就调整一次,何必内耗啊。...很显然,平衡二叉树的优势在于不会出现普通二叉查找树的最差情况。其查找的时间复杂度为O(logN)。

    1.2K00

    【C++深度探索】AVL树与红黑树的原理与特性

    而AVL树和红黑树是常用的自平衡二叉搜索树。它们在插入、删除和查找操作上具有较好的性能,并且在各种应用场景中被广泛使用。...1.2 AVL树的性质 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树: 它的左右子树都是AVL树 左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1) 如果一棵二叉搜索树是高度平衡的...), _pRight(nullptr), _pParent(nullptr) , _data(data), _color(color) {} }; 红黑树的节点与AVL树一样需要父节点的指针,因为红黑树在插入新节点或删除节点时会出现不满足红黑树性质的情况...3.结语   使用AVL树和红黑树时,可以按照二叉搜索树的规则进行插入、删除和查找操作。由于它们的自平衡特性,插入和删除操作可能需要进行旋转或颜色调整,以确保树的平衡性。...这些操作可以保证树的高度保持在O(logn),从而提供了较好的性能。   在实际应用中,AVL树和红黑树都可以用于需要高效的插入、删除和查找操作的场景,例如数据库中的索引结构、编译器中的符号表等。

    14710

    【C++高阶】:AVL树的全面探索和深度学习

    前言 前面我们学到了二叉搜索树,【C++高阶】二叉搜索树的全面解析与高效实现 虽然二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素...AVL树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。...那么AVL树的插入过程可以分为两步: 按照二叉搜索树的方式插入新节点 调整节点的平衡因子 在我们进行插入操作之前,我们先定义一个AVL树的类 AVL树定义: templateAVL树的旋转 如果在一棵原本是平衡的AVL树中插入一个新节点,可能造成不平衡,此时必须调整树的结构, 使之平衡化。...缺陷 原因 插入操作复杂 为了保持树的平衡,每次插入或删除节点时,AVL树可能需要进行多次旋转操作。

    9910

    c语言函数的迭代与递归_递归与迭代

    = 3; i <= n; i++) { n3 = n1 + n2; n1 = n2; n2 = n3; } return n3; } 递归和迭代的区别: 1.什么是递归 是一种算法思想:是将大问题分解成若干个结构相同的子问题...我们将这样的算法思想称之为递归。 在C语言中,有一种函数,该函数可以在函数体中调用自己,这样函数称之为递归函数。...递归有两个过程: 递推 回归 2.什么是迭代 迭代是对递归的一种优化,递归将递推的过程交给了计算机,让计算机代替人去分析问题。而迭代将递推(归纳抽象解决方案)的过程交给 了程序员。...3.递归的特点 1.解放了人 2.对栈的消耗大 3.算法的效率低下,不能过多层的递归 4.迭代的特点 1.需要人去分析迭代过程 2.减小的对栈的开销 3.算法的效率高 5.什么时候使用递归 1.递归层次不多...2.对于栈消耗不是很大时 6.什么时候使用迭代 如果一个问题,可以使用迭代来实现,就尽量使用迭代。

    1.1K10

    【C++深度探索】深入解析AVL树的底层实现机制

    树的插入 AVL树的插入过程可以分为两步: 按照二叉搜索树的方式插入新节点 调整节点的平衡因子 在插入新节点之后,AVL树的平衡性可能会遭到破坏,此时就需要更新平衡因子,并检测是否破坏了AVL树的平衡性...0(不可能是2,因为这样没插入新节点前该树就已经不平衡了),插入后被更新成正负1,此时以pParent为根的树的高度增加,需要继续向上更新,如下图所示: AVL树插入新节点90之后,pParent也就是...树不能插入相同节点 AVL树插入新节点的逻辑结构如上述代码所示,如果在一棵原本是平衡的AVL树中插入一个新节点,可能造成不平衡,此时必须调整树的结构,使之平衡化。...根据节点插入位置的不同,AVL树的旋转分为四种:那么我们具体来看看AVL树旋转的实现: ✨左单旋 新节点插入较高右子树的右侧—右右:左单旋 parent和cur的平衡因子经过旋转之后变为0,维持了...child的子树上即可,所以可以是下图中的b或c,这里选择b: 前文我们说过只要插入在child的子树上即可,所以可以是上图中的b或c,这里选择b,那么如果是c的话,还是需要进行左右双旋,与选b的区别在于平衡因子的不同

    9910

    (史上超级清晰图解分析版)AVL树的实现--C++

    一、AVL的概念 AVL树是最先发明的自平衡二叉查找树,AVL是一颗空树,或者具备下列性质的二叉搜索树:它的左右子树都是AV树,且左右子树的高度差的绝对值不超过1。...树的插入 2.1AVL树插入一个值的大概过程 插入一个值按二叉搜索树规则进行插入。...3.2右单旋 下面图1展示的是10为根的树,有a/b/c抽象为三棵高度为h的子树(h>=0),a/b/c均符合AVL树的要求。10可能是整棵树的根,也可能是一个整棵树中局部的子树的根。...10为根的树,有a/b/c抽象为三棵高度为h的子树(h>=0),a/b/c均符合AVL树的要求。...AVL树的删除不做详细讲解。 有兴趣可参考:《殷人昆 数据结构:用面向对象方法与C++语言描述》中讲解。

    10310

    【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道

    逐步实现AVL树:本篇文章将带你一步一步实现一个自平衡的二叉查找树——AVL树,从最基本的节点结构开始,逐步实现插入、查找等操作,并确保每个步骤都详细讲解。...AVL树的核心特点是它保证树的每个节点的左右子树的高度差(平衡因子)不超过1,从而保证了AVL树在插入、删除和查找操作时的时间复杂度始终为O(log N)。...因此,AVL树非常适用于需要频繁插入和删除操作的场景。 1.4 AVL树的操作 AVL树的主要操作有: 插入操作:在树中插入节点,并在插入后调整平衡因子。...3.1 插入操作概述 AVL树的插入操作包括三步: 按二叉查找树规则插入节点; 更新每个节点的平衡因子; 如果需要,进行旋转操作来恢复树的平衡。...以上就是关于【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道的内容啦,各位大佬有什么问题欢迎在评论区指正,或者私信我也是可以的啦,您的支持是我创作的最大动力!

    9800

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

    AVL树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。...那么AVL树的插入过程可以分为两步: 按照二叉搜索树的方式插入新节点 调整节点的平衡因子 在我们进行插入操作之前,我们先定义一个AVL树的类 AVL树定义示例(C++): templateAVL树的插入操作涉及到旋转操作,我们先演示一下它的全部代码 AVL树插入示例(C++): bool Insert(const pair& kv) { // 当根节点为空时直接插入...AVL树的验证 AVL树是在二叉搜索树的基础上加入了平衡性的限制,因此要验证AVL树,可以分两步: 验证其为二叉搜索树 如果中序遍历可得到一个有序的序列,就说明为二叉搜索树 代码演示示例(C++)...AVL树的缺陷 缺陷 原因 插入操作复杂 为了保持树的平衡,每次插入或删除节点时,AVL树可能需要进行多次旋转操作。

    21310

    【C++】红黑树的插入分析及验证

    g ,uncle节点省略为u ,parent节点省略为p,cur节点省略为c 情况1—— uncle节点存在且为红色(g p c左斜形成一条直线) 当插入红色节点后,与父节点形成连续的红色节点...---- 将c作为g的左子树,将g作为p的右子树 将g置为红色 将p置为黑色 RotateR/RotateL的实现,与AVL树的类似,只需把原来的代码的平衡因子去掉即可 不懂查看:AVL树的实现...; while (cur) { //若插入的值比当前树的值小 插入左边 if (cur->_kv.first > kv.first) {...parent = cur; cur = cur->_left; } //若插入的值比当前树的值大 插入右边 else if (cur->_kv.first...,在树中有相同的值 ,则插入失败 return false; } } cur = new Node(kv); //再次判断parent当前节点值与插入值大小

    18010

    校门外的树(C语言)

    《肖申克的救赎》 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。...这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。...你的任务是计算将这些树都移走后,马路上还有多少棵树。 输入格式 第一行有两个整数L(1 的长度,M代表区域的数目。...接下来的M行每行两个不同的整数,表示一个区域的起始点和终止点的坐标。 输出格式 输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。...+; printf("%d\n",c); } 运行结果:‍‍‍‍ ?

    1.5K40

    【C++的剃刀】我不允许你还不会AVL树

    // 该节点的平衡因子 }; AVL树的插入 AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树。...那么 AVL树的插入过程可以分为两步: 1. 按照二叉搜索树的方式插入新节点 2....树的旋转 如果在一棵原本是平衡的AVL树中插入一个新节点,可能造成不平衡,此时必须调整树的结构, 使之平衡化。...根据节点插入位置的不同,AVL树的旋转分为四种: 1. 新节点插入较高左子树的左侧 --- 左左:右单旋 2....但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。

    5210

    【AVL树】—— 我与C++的不解之缘(二十三)

    AVL树是最先发明的自平衡二叉搜索树,说白了就是能够自己控制平衡结构的一个二叉搜索树;AVL可以是一个空树,或者其左右树都是AVL树,且左右子树的高度差的绝对值不超过1。...AVL树的插入 插入过程 对于插入数据的整个过程,其实就是在搜索二叉树的基础上,增加了更新平衡因子和在更新平衡因子的过程中需要旋转的情况就行旋转。...,这样以parent为根节点的子树就已经不满足AVL树的结构了,此时就需要对该树就行旋转(旋转:一是将以parent为根节点的子树调整平衡,二是降低以parent为根节点的子树的高度,回复到插入以前的高度...AVL树的查找 AVL树的查找先对就简单多了,和搜索二叉树查找一样。...`AVL`树的查找 `AVL`树的查找先对就简单多了,和搜索二叉树查找一样。

    8200

    平衡二叉树之AVL树

    带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。 1....AVL树数据结构 为了方便计算每个节点的平衡因子,对二叉树的数据结构进行修改,增加一个数据单元用于记录以该节点为root的子树高度,重新定义数据结构如下(代码采用C实现): ? 2....AVL树旋转操作 AVL在插入和删除节点造成不平衡的时候需要对发生不平衡的节点及时调整,调整方法为旋转操作。...下图所示为LR构型,在B节点的右子树上插入新节点导致A节点失衡,调整过程分两个步骤:首先以C为轴心,B绕C逆时针旋转,生成的子树作为A的左子树;这样就变化成了LL型,然后用上图所示的方法调整即可。...插入节点 向AVL树中插入节点后,要判断是否引起失衡,如果失衡则需要进一步确定构型,选择合适的基本旋转操作来调整。 ?---- 4.

    1.1K120
    领券