【1066 25 AVL】 Root of AVL Tree

传送门

题意

给定一个长度为 \(n\) 的序列,求将这个序列建成 AVL 的树根值

数据范围

\(n\leq 20\)

题解

AVL 模版默写,没有删除操作

Code

#include<bits/stdc++.h>
using namespace std;
struct avl{
    int h,val;
    avl *l,*r;
    avl(int x,avl*left=nullptr,avl*right=nullptr):val(x),h(1),l(left),r(right){}
};
int geth(avl* root){ return root==nullptr?0:root->h;}
avl * right(avl * a){
    avl * b=a->l;
    a->l=b->r;
    b->r=a;
    a->h=max(geth(a->r),geth(a->l))+1;
    b->h=max(geth(b->r),geth(b->l))+1;
    return b;
}
avl* left(avl * a){
    avl*b=a->r;
    a->r=b->l;
    b->l=a;
    a->h=max(geth(a->r),geth(a->l))+1;
    b->h=max(geth(b->r),geth(b->l))+1;
    return b;
}
avl *lr(avl *a){
    a->l=left(a->l);
    return right(a);
}
avl *rl(avl *a){
    a->r=right(a->r);
    return left(a);
}
avl * avlinsert(avl *& root,int x){
    if(root==nullptr) root=new avl(x);
    else if(x > root->val){
        root->r=avlinsert(root->r,x);
        int delta=geth(root->r)-geth(root->l);
        if(delta==2) {
            if(x > root->r->val) root=left(root);
            else root=rl(root);
        }
    }
    else if(x<root->val){
        root->l=avlinsert(root->l,x);
        int delta=geth(root->l)-geth(root->r);
        if(delta==2){
            if(x<root->l->val) root=right(root);
            else root=lr(root);
        }
    }
    root->h=max(geth(root->l),geth(root->r))+1;
    return root;
}
int main(){ 
    int n,x; cin>>n;
    avl *root=nullptr;
    for(int i=0;i<n;i++) cin>>x,root=avlinsert(root,x);
    cout<<root->val;
}
posted @ 2021-02-28 22:40  Hyx'  阅读(57)  评论(0)    收藏  举报