An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the root of the resulting AVL tree in one line.
Sample Input 1:
5
88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:
88
#include <iostream>
#include <vector>
using namespace std;
#define rep(i,j,k) for(int i=j;i<k;i++)
struct node{
int d;
node *l,*r;
};
node* left(node *u){
node *t = u->r;
u->r = t->l;
t->l = u;
return t;
}
node* right(node *u){
node *t = u->l;
u->l = t->r;
t->r = u;
return t;
}
node* lr(node *u){
u->l = left(u->l);
return right(u);
}
node* rl(node *u){
u->r = right(u->r);
return left(u);
}
int getH(node *u){
if(u==NULL) return 0;
return max(getH(u->l),getH(u->r)) + 1;
}
node* insert(node *u,int d){
if(u==NULL){
u = new node();
u->d = d;
u->l = u->r = NULL;
}else if(d < u->d){
u->l = insert(u->l,d);
if(getH(u->l) - getH(u->r) == 2)
u = d < u->l->d ? right(u) : lr(u);
}else{
u ->r = insert(u->r,d);
if(getH(u->l) - getH(u->r) == -2)
u = d > u->r->d ? left(u) : rl(u);
}
return u;
}
int main(){
std::ios::sync_with_stdio(false);
int n,a;
cin>>n;
node *root = NULL;
rep(i,0,n){
cin>>a;
root = insert(root,a);
}
printf("%d",root->d);
return 0;
}