PTA7-3 平衡二叉树的根

发布时间 2023-12-13 10:34:45作者: Mcggvc

将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。

输入格式:

输入的第一行给出一个正整数N(≤20),随后一行给出N个不同的整数,其间以空格分隔。

输出格式:

在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。

输入样例1:

5
88 70 61 96 120

输出样例1:

70

输入样例2:

7
88 70 61 96 120 90 65

输出样例2:

88

代码:

#include <bits/stdc++.h>
using namespace std;
class AVL {
private :
    struct node {
        int l, r;
        int val, dep;
    };
    int root, num; vector<node> e;
    void update(int &p) {
        e[p].dep = max(e[e[p].l].dep, e[e[p].r].dep) + 1;
    }
    void zig(int &p) { //右旋 
        int q = e[p].l;
        e[p].l = e[q].r; e[q].r = p; swap(p, q);
        update(q); update(p);
    }
    void zag(int &p) { //左旋
        int q = e[p].r;
        e[p].r = e[q].l; e[q].l = p; swap(p, q);
        update(q); update(p);
    }
    void adjust(int &p) {
        update(p);
        if(e[e[p].l].dep - e[e[p].r].dep >= 2) {
            int &q = e[p].l;
            if(e[e[q].l].dep < e[e[q].r].dep) {
                zag(q);
            }
            zig(p);
        } else if(e[e[p].r].dep - e[e[p].l].dep >= 2) {
            int &q = e[p].r;
            if(e[e[q].l].dep > e[e[q].r].dep) {
                zig(q);
            }
            zag(p);
        }
    }
    int newpoint(int val) {
        node &tmp = e[++num]; tmp.val = val;
        tmp.dep = 1; 
        return num;
    }
    void insert__(int &p, int val) {
        if(p == 0) {
            p = newpoint(val); update(p);
            return ;
        }
        if(val < e[p].val) {
            insert__(e[p].l, val); adjust(p);
        } else {
            insert__(e[p].r, val); adjust(p);
        }
    }
public :
    AVL(int siz) {
        e.resize(siz + 1); e[0].dep = 0;
        root = 0; num = 0;
    }
    void insert(int val) {
        insert__(root, val);
    }
    int getroot() {
        return e[root].val;
    }
};

int main() {
    // freopen("data.in", "r", stdin);
    int n; cin >> n;
    AVL T(n);
    for(int i = 1; i <= n; i++) {
        int x; cin >> x;
        T.insert(x);
    }
    cout << T.getroot();
    return 0;
}