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>
using namespace std;
struct node{
int v,h;
struct node *Ltree,*Rtree;
};
typedef struct node * AVLtree;
int max(int a,int b);
int geth(AVLtree a);
AVLtree BuildTree(AVLtree T,int V);
AVLtree RR(AVLtree root);
AVLtree RL(AVLtree root);
AVLtree LL(AVLtree root);
AVLtree LR(AVLtree root);
int main()
{
int N,i,V;
cin >> N;
AVLtree T = NULL;
for(i = 0;i < N;i++){
cin >> V;
T = BuildTree(T,V);
}
cout << T->v;
return 0;
}
int max(int a,int b)
{
return a > b? a : b;
}
int geth(AVLtree a)
{
if(a == NULL)
return 0;
else
return a->h;
}
AVLtree BuildTree(AVLtree T,int V)
{
if(T == NULL){
T = new node();
T->v = V;
T->Ltree = T->Rtree = NULL;
T->h = 1;
return T;
}
if(V > T->v){
T->Rtree = BuildTree(T->Rtree,V);
if(geth(T->Rtree)-geth(T->Ltree) == 2){
if(V > T->Rtree->v)
T = RR(T);
else
T = RL(T);
}
}
else{
T->Ltree = BuildTree(T->Ltree,V);
if(geth(T->Ltree)-geth(T->Rtree) == 2){
if(V > T->Ltree->v)
T = LR(T);
else
T = LL(T);
}
}
T->h = max(geth(T->Ltree),geth(T->Rtree))+1;
return T;
}
AVLtree RR(AVLtree root)
{
AVLtree temp = root;
root = root->Rtree;
temp->Rtree = root->Ltree;
root->Ltree = temp;
temp->h = max(geth(temp->Ltree),geth(temp->Rtree))+1;
root->h = max(geth(root->Ltree),geth(root->Rtree))+1;
return root;
}
AVLtree RL(AVLtree root)
{
root->Rtree = LL(root->Rtree);
return RR(root);
}
AVLtree LL(AVLtree root)
{
AVLtree temp = root;
root = root->Ltree;
temp->Ltree = root->Rtree;
root->Rtree = temp;
temp->h = max(geth(temp->Ltree),geth(temp->Rtree))+1;
root->h = max(geth(root->Ltree),geth(root->Rtree))+1;
return root;
}
AVLtree LR(AVLtree root)
{
root->Ltree = RR(root->Ltree);
return LL(root);
}