1066 Root of AVL Tree (25 分)
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 <bits/stdc++.h>
using namespace std;
struct st
{
int v,height;
st* l,*r;
}*root;
st* newnode(int v)
{
st* node=new st;
node->v=v;
node->height=1;
node->l=node->r=NULL;
return node;
}
int getheight(st* root)
{
if(root==NULL)return 0;
return root->height;
}
void updateheight(st* root)
{
root->height=max(getheight(root->l),getheight(root->r))+1;
}
int getblancefactor(st* root)
{
return getheight(root->l)-getheight(root->r);
}
void L(st* &root)
{
st* temp=root->r;
root->r=temp->l;
temp->l=root;
updateheight(root);
updateheight(temp);
root=temp;
}
void R(st* &root)
{
st* temp=root->l;
root->l=temp->r;
temp->r=root;
updateheight(root);
updateheight(temp);
root=temp;
}
void insert(st* &root,int v)
{
if(root==NULL)
{
root=newnode(v);
return;
}
if(v<root->v)
{
insert(root->l,v);
updateheight(root);
if(getblancefactor(root)==2)
{
if(getblancefactor(root->l)==1)
{
R(root);
}
else if(getblancefactor(root->l)==-1)
{
L(root->l);
R(root);
}
}
}
else
{
insert(root->r,v);
updateheight(root);
if(getblancefactor(root)==-2)
{
if(getblancefactor(root->r)==-1)
{
L(root);
}
else if(getblancefactor(root->r)==1)
{
R(root->r);
L(root);
}
}
}
}
st* create(int data[],int n)
{
st* root=NULL;
for(int i=0; i<n; i++)
{
insert(root,data[i]);
}
return root;
}
int main()
{
int n,v;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&v);
insert(root,v);
}
printf("%d\n",root->v);
return 0;
}