请问AVL树的实现及分析怎么做?请擅长数据结构的同志帮个忙

请问AVL树的实现及分析怎么做?请擅长数据结构的同志帮个忙,问题和要求在图片里。
我基础比较薄弱,只会一些C语言,麻烦讲得详细一些,非常感谢!

img

img

img

AVL树是一种自平衡二叉搜索树,它的设计可以保证任意节点的左右子树高度差不超过1。这种性质可以有效地提高树的查找、插入和删除等操作的效率。下面是使用C语言实现AVL树的步骤:
1、定义结构体
首先,需要定义一个结构体来表示AVL树的每个节点。这个结构体通常包含一个值域、一个指向左子树的指针、一个指向右子树的指针、以及一个表示节点的高度的整数值。

struct AVLNode {
    int value;
    struct AVLNode *left;
    struct AVLNode *right;
    int height;
};

实现插入操作
AVL树的插入操作可以通过以下步骤完成:

在树中找到适当的位置插入新节点;
从插入节点的父节点开始,逐级检查每个祖先节点,看它们的子树高度差是否超过了1;
如果某个节点的子树高度差超过了1,就进行旋转操作来使树重新保持平衡。

struct AVLNode* insert(struct AVLNode* node, int value) {
    if (node == NULL) {
        // 如果树为空,创建一个新节点并返回
        struct AVLNode* new_node = (struct AVLNode*)malloc(sizeof(struct AVLNode));
        new_node->value = value;
        new_node->left = NULL;
        new_node->right = NULL;
        new_node->height = 1;
        return new_node;
    }

    if (value < node->value) {
        // 如果新节点的值小于当前节点的值,往左子树插入
        node->left = insert(node->left, value);
    } else {
        // 如果新节点的值大于等于当前节点的值,往右子树插入
        node->right = insert(node->right, value);
    }

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

    // 计算节点的平衡因子
    int balance = get_balance(node);

    // 如果节点的平衡因子超过1,需要进行旋转操作来使树重新保持平衡
    if (balance > 1) {
        if (value < node->left->value) {
            // LL情况,进行右旋操作
            return right_rotate(node);
        } else {
            // LR情况,先进行左旋操作,再进行右旋操作
            node->left = left_rotate(node->left);
            return right_rotate(node);
        }
    } else if (balance < -1) {
        if (value > node->right->value) {
            // RR情况,进行左旋操作
            return left_rotate(node);
        } else {
            // RL情况,先进行右旋操作,再进行左旋操作
            node->right = right_rotate(node->right);
            return left_rotate(node);
        }
    }

    return node;

提供参考实例:https://blog.csdn.net/weixin_42562387/article/details/106176426

可以参考这个

void insert(int key)
{
    //定义一个临时指针 用于移动
    Node* temp = root;//方便移动 以及 跳出循环
    Node* prev = NULL;//定位到待插入位置的前一个结点
    while (temp != NULL)
    {
        prev = temp;
        if (key < temp->data)
        {
            temp = temp->left;
        }
        else if(key > temp->data)
        {
            temp = temp->right;
        }
        else
        {
            return;
        }
    }
 
    if (key < prev->data)
    {
        prev->left = (Node*)malloc(sizeof(Node));
        prev->left->data = key;
        prev->left->left = NULL;
        prev->left->right = NULL;
    }
    else
    {
        prev->right = (Node*)malloc(sizeof(Node));
        prev->right->data = key;
        prev->right->left = NULL;
        prev->right->right = NULL;
    }
}

https://blog.csdn.net/weixin_54186646/article/details/124412656

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:AVL树的插入

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^