04-树5 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<iostream>
using namespace std;
typedef struct AVLNode* AVLTree;
struct AVLNode{
int Data;
AVLTree Left,Right;
int Height;
};
int Max(int a,int b){
return a>b?a:b;
}
int GetHeight(AVLTree T){
if(!T)return -1;
else return T->Height;
}
AVLTree SingleLeftRotation(AVLTree T){
AVLTree B;
if(!T)return NULL;
else{
B=T->Left;
T->Left=B->Right;
B->Right=T;
T->Height=Max(GetHeight(T->Left),GetHeight(T->Right))+1;
B->Height=Max(T->Height,GetHeight(B->Left))+1;
}
return B;
}
AVLTree SingleRightRotation(AVLTree T){
AVLTree B;
if(!T)return NULL;
else{
B=T->Right;
T->Right=B->Left;
B->Left=T;
T->Height=Max(GetHeight(T->Left),GetHeight(T->Right))+1;
B->Height=Max(T->Height,GetHeight(B->Right))+1;
}
return B;
}
AVLTree DoubleLeftRightRotation(AVLTree T){
if(!T)return NULL;
else{
T->Left=SingleRightRotation(T->Left);
return SingleLeftRotation(T);
}
}
AVLTree DoubleRightLeftRotation(AVLTree T){
if(!T)return NULL;
else{
T->Right=SingleLeftRotation(T->Right);
return SingleRightRotation(T);
}
}
AVLTree Insert(AVLTree T,int X){
if(!T){
T=(AVLTree)malloc(sizeof(AVLNode));
T->Data=X;
T->Left=T->Right=NULL;
T->Height=0;
}else{
if(X>T->Data){
T->Right=Insert(T->Right,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==-2){
if(X>T->Right->Data){
T=SingleRightRotation(T);
}else{
T=DoubleRightLeftRotation(T);
}
}
}else{
T->Left=Insert(T->Left,X);
if(GetHeight(T->Left)-GetHeight(T->Right)==2){
if(X<T->Left->Data){
T=SingleLeftRotation(T);
}else{
T=DoubleLeftRightRotation(T);
}
}
}
T->Height=Max(GetHeight(T->Left),GetHeight(T->Right))+1;
}
return T;
}
int main(){
int N,V;
AVLTree T=NULL;
scanf("%d",&N);
while(N--){
scanf("%d",&V);
T=Insert(T,V);
}
printf("%d\n",T->Data);
}