【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;
}

浙公网安备 33010602011771号