首页
学习
活动
专区
工具
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.红黑从当前根节点到每条路径上黑色节点数量都相同。

65820

数据结构——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==

    20230

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

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

    15610

    平衡二叉 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.1K00

    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和红黑都可以用于需要高效插入、删除和查找操作场景,例如数据库中索引结构、编译器中符号表等。

    13510

    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区别在于平衡因子不同

    8810

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

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

    17810

    校门外C语言

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

    1.5K40

    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当前节点值与插入值大小

    17110

    平衡二叉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

    C++进阶学习】第七弹——AVL——树形结构存储数据经典模块

    二叉搜索:【C++进阶学习】第五弹——二叉搜索——二叉进阶及set和map铺垫-CSDN博客 前言: 在前面我们学习二叉搜索时候,虽然大部分情况下二叉搜索效率都是很高,但是如果是一组相对有序数字...,我们用二叉搜索来排序就会显得比较麻烦了,因此,AVL就出现了,下面就让我们一起来学习以下AVL相关知识 一、AVL概念 AVL实际上就是特殊二叉搜索,是对二叉搜索改进,我们在用树形结构来查找或操作数据时候...二、AVL原理与实现 了解了AVL基本内容之后,接下来我们就来一步一步学习以下AVL原理到底是什么以及如何实现一个AVLAVL节点 template<class K,class V...-1,右子树插入一个节点时+1 {} }; AVL节点操作与二叉搜索还是比较相似的,都有左子树右子树和父亲节点叉式结构,比较不同是加入了一个平衡因子 AVL插入 实现AVL重点就是解决...AVL插入问题,而解决插入问题最关键就是要做到如何让左右子树高度绝对值适合不大于1,我们是通过合理旋转来实现,而且需要旋转情况也是分为四种: RR型:左旋 LL型:右旋 RL型:先右旋

    8210

    c++】map和set&&AVL&&红黑详解&&模拟实现&&map和set封装

    底层结构 4.1 AVL 4.1.1 AVL概念 4.1.2 AVL树节点定义 4.1.3 AVL插入 4.1.4 AVL旋转 4.1.4.1 右单旋 4.1.4.2 左单旋 4.1.4.3...// 该节点平衡因子 }; 4.1.3 AVL插入 AVL就是在二叉搜索基础上引入了平衡因子,因此AVL也可以看成是二叉搜索。...先按照二叉搜索规则将节点插入AVL中 // ... // 2....新节点插入后,AVL平衡性可能会遭到破坏,此时就需要更新平衡因子, // 并检测是否破坏了AVL平衡性 /* pCur插入后,pParent平衡因子一定需要调整,在插入之前,pParent...旋转 如果在一棵原本是平衡AVL插入一个新节点,可能造成不平衡,此时必须调整结构,使之平衡化。

    25610

    C语言实现跳动圣诞,自学C语言圣诞表白!

    “要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆 这道理放在C语言学习上也一并受用。...在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历是日积月累学习。 那么如何学习呢?当然是每天都练习一道C语言题目!!...经典:如何用C语言画一个“圣诞”,我使用了左右镜像Sierpinski triangle,每层减去上方一小块,再用符号点缀。...可生成不同层数「圣诞」 源代码演示: #include  #include  #include    #define PI 3.14159265359...'*' : ' '); } 编译运行结果如下: 代码已经有了,去给你心仪女生表白叭,这个我没法替你

    8.2K3420

    红黑简单介绍

    例如: 下图就是一个红黑,同时也是一颗二叉搜索AVL不同是,AVL依靠着平衡因子限制平衡性比红黑要更高 红黑性质 1. 每个结点不是红色就是黑色 2....,而且他平衡性还没有AVL高 确实红黑搜索时间复杂度没有AVL这么快,但是红黑搜索效率和AVL可以近似看作相等,但是红黑不需要那么多旋转来调平衡,因为红黑可以允许最长路径是最短路径...2倍,他要求并没有AVL那么严格,所以红黑旋转次数要比AVL少很多,效率自然就提升了,故而实际应用中红黑要比AVL更多一些。...红黑定义 根据上面的红黑性质和我们之前学习AVL知识铺垫,我们就可以很快将红黑基本框架搭起来: 与AVL平衡因子不同,红黑除了节点外还要枚举节点颜色 我们将黑色和红色先进行枚举...例如: 下图中新增红节点不一定会导致红黑不平衡,但是如果新增节点颜色是黑色,那么一定要进行操作来保持这棵平衡 红黑插入AVL一样,红黑插入操作可以分为两步: 1.按照二叉搜索规则插入新节点

    9210

    C语言二叉实现

    和图是数据结构中比较麻烦东西,里面涉及概念比较多,也最有用, 就比如一般广泛应用于人工智能博弈上,而基于图广度优先和深度优先搜索也广泛应用于人工智能寻路上面 首先我们要把进行分类: >一般...C,BC父节点是A 堂兄弟:D堂兄弟是EF 根据上面的概念和上面对定义你应该知道这是一个二叉。...由于二叉广泛应用与研究,所以这里我们讨论二叉,其实森林和一般都可以转化为一个一般,转换原则就是把一个节点第一个子节点变成二叉左节点,然后其他堂兄弟就是右节点,这句话不指望你能看懂,因为我都感觉没有表述清楚...node,*d=new node,*e=new node,*f=new node,*g=new node; a->data='A'; b->data='B'; c->data='C'; d->...=NULL; c->lchild=e; c->rchild=f; d->lchild=NULL; d->rchild=NULL; e->lchild=g; e->rchild=NULL;

    1.7K20

    C++精通之路:红黑迭代模拟实现和讲解

    这是我参与「掘金日新计划 · 10 月更文挑战」第8天,点击查看活动详情 一:红黑迭代器 需要注意是: 迭代器本质上是指针一个封装类,其底层就是指针;好处是可以方便遍历,是数据结构底层实现与用户透明...对于string,vector,list等容器,其本身结构上是比较简单迭代实现也很简单;但是对于二叉树结构红黑来说需要考虑很多问题 1.begin()与end() STL明确规定,begin...()与end()代表是一段前闭后开区间 对红黑进行中序遍历后,可以得到一个有序序列,因此begin()可以放在红黑中最小节点(即最左侧节点)位置,end()放在最大节点(最右侧节点)下一个位置即...因为反向迭代器与正向迭代器在原理实现中是相同,只是方向反了而已 所以我们可以用正向迭代器来封装出反向迭代器,在正向迭代基础上,对其接口进行封装达到反向迭代效果 正向迭代器实现代码: template...因为set是K模型容器,而map是KV模型容器.所以要用红黑来模拟实现这两个容器,需要添加一些东西使得其能适配两者,添加和改变东西如下: 1.

    49110
    领券