题意
构造一棵AVL树,输出根结点的值。
参考代码
#include <bits/stdc++.h>
using namespace std;
typedef struct Node{
int v,h;
struct Node *l,*r;
}*tree;
int GetHigh(tree t){
if (t==NULL) return 0;
return max(GetHigh(t->l),GetHigh(t->r))+1;
}
tree RotateLL(tree &A){
tree B=A->l;
A->l=B->r;
B->r=A;
B->h=max(GetHigh(B->l),GetHigh(B->r))+1;
A->h=max(GetHigh(A->l),GetHigh(B->r))+1;
return B;
}
tree RotateRR(tree &A){
tree B=A->r;
A->r=B->l;
B->l=A;
B->h=max(GetHigh(B->l),GetHigh(B->r))+1;
A->h=max(GetHigh(A->l),GetHigh(B->r))+1;
return B;
}
tree RotateLR(tree &A){
A->l=RotateRR(A->l);
return RotateLL(A);
}
tree RotateRL(tree &A){
A->r=RotateLL(A->r);
return RotateRR(A);
}
tree Insert(tree &t,int x){
if (t==NULL){
t=new Node;
t->v=x;
t->h=0;
t->l=t->r=NULL;
return t;
}
if (x<t->v){
t->l=Insert(t->l,x);
if (GetHigh(t->l)-GetHigh(t->r)==2){
if (x<t->l->v) t=RotateLL(t);
else t=RotateLR(t);
}
}
else{
t->r=Insert(t->r,x);
if (GetHigh(t->l)-GetHigh(t->r)==-2){
if (x>t->r->v) t=RotateRR(t);
else t=RotateRL(t);
}
}
t->h=max(GetHigh(t->l),GetHigh(t->r))+1;
return t;
}
int main(){
int n,x;
cin>>n;
tree t=NULL;
for (int i=0;i<n;i++){
cin>>x;
Insert(t,x);
}
cout<<t->v<<endl;
return 0;
}