【PAT甲级】1066. Root of AVL Tree (25)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

typedef struct Node {
    Node *left;
    Node *right;
    int key;
} Node;

void insert(Node* &r, int k);
int height(Node *r);
int max(int a, int b);
void balance(Node* &n);
void rotate_left(Node* &n);
void rotate_right(Node* &n);

int main(int argc, char *argv[]) {
    int m;
    Node *tree = NULL;
    scanf("%d", &m);
    for (int i = 0; i < m; i++) {
        int k;
        scanf("%d", &k);
        insert(tree, k);
    }
    printf("%d\n", tree->key);
    return 0;
}

void insert(Node* &r, int k) {
    if (r == NULL) {
        Node *n = (Node *)malloc(sizeof(Node));
        n->key = k;
        n->left = n->right = NULL;
        r = n;
    } else if (k < r->key) {
        insert(r->left, k);
        if (abs(height(r->left)-height(r->right)) > 1)
            balance(r);
    } else {
        insert(r->right, k);
        if (abs(height(r->left)-height(r->right)) > 1)
            balance(r);
    }
    return;
}
int height(Node *r) {
    if (r == NULL) return 0;
    return max(height(r->left), height(r->right)) + 1;
}
int max(int a, int b) {
    return a > b ? a : b;
}
void balance(Node* &n) {
    if (height(n->left) - height(n->right) == 2) {
        if (height(n->left->left) > height(n->left->right)) {
            rotate_right(n);
        } else {
            rotate_left(n->left);
            rotate_right(n);
        }
    } else if (height(n->left) - height(n->right) == -2) {
        if (height(n->right->right) > height(n->right->left)) {
            rotate_left(n);
        } else {
            rotate_right(n->right);
            rotate_left(n);
        }
    }
    return;
}
void rotate_right(Node* &n) {
    Node *a = n->left;
    n->left = n->left->right;
    a->right = n;
    n = a;
    return;
}
void rotate_left(Node* &n) {
    Node *a = n->right;
    n->right = n->right->left;
    a->left = n;
    n = a;
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值