pat 1066(AVL Tree)

本文详细介绍了AVL树的实现,包括节点结构定义、最大高度计算、单旋转、双旋转以及插入操作。通过实例代码展示如何在二叉搜索树的基础上保持平衡,确保高效的搜索、插入和删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AVL Tree

#include<stdio.h>

struct avl{
    int num;
    struct avl *left, *right;
    int height;
};
int max(int a, int b){
    return a > b ? a : b;
}
int height(struct avl *t){
    if (!t)
        return -1;
    else return t->height;
}
struct avl *SingleRotationWithLeft(struct avl *t){
    struct avl *k;
    k = t->left;
    t->left = k->right;
    k->right = t;
    t->height = max(height(t->left), height(t->right)) + 1;
    k->height = max(height(k->left), height(k->right)) + 1;
    return k;
}
struct avl *SingleRotationWithRight(struct avl *t){
    struct avl *k;
    k = t->right;
    t->right = k->left;
    k->left = t;
    t->height = max(height(t->left), height(t->right)) + 1;
    k->height = max(height(k->left), height(k->right)) + 1;
    return k;
}

struct avl *DoubleRotationWithLeft(struct avl *t){
    t->left = SingleRotationWithRight(t->left);
    t = SingleRotationWithLeft(t);
    return t;
}

struct avl *DoubleRotationWithRight(struct avl *t){
    t->right = SingleRotationWithLeft(t->right);
    t = SingleRotationWithRight(t);
    return t;
}
struct avl* Insert(int num, struct avl *t){
    if (!t){
        t = new struct avl;
        t->num = num;
        t->height = 0;
        t->left = t->right = NULL;
    }
    else if (t->num > num){
        t->left = Insert(num, t->left);
        if (height(t->left) - height(t->right) > 1)
            if (t->left->num > num)
                t = SingleRotationWithLeft(t);
            else t = DoubleRotationWithLeft(t);
            t->height = max(height(t->right), height(t->left)) + 1;
    }
    else if (t->num < num){
        t->right = Insert(num, t->right);
        if (height(t->right) - height(t->left)>1)
            if (t->right->num < num)
                t = SingleRotationWithRight(t);
            else t = DoubleRotationWithRight(t);
            t->height = max(height(t->right), height(t->left)) + 1;
    }
    return t;
}
int main(){
    int n;
    freopen("1.in", "r", stdin);
    scanf("%d", &n);
    int i,num;
    struct avl *t = NULL;
    for (i = 0; i < n; i++){
        scanf("%d", &num);
        t = Insert(num, t);
    }
    if (t)
        printf("%d\n", t->num);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值