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.
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
大意:建立一个平衡二叉树,返回它的根结点
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <stack>
#include <queue>
using namespace std;
#define ll long long
typedef struct AVLNode
{
int data;
int height;
AVLNode *l,*r;
}*AVLTree;
int Getheight(AVLTree A)
{
if(!A)
return 0;
else
return A->height;
}
AVLTree LeftRotation(AVLTree A)
{
AVLTree B = A->l;
A->l = B->r;
B->r = A;
A->height = max(Getheight(A->l),Getheight(A->r))+1;
B->height = max(Getheight(B->l),A->height)+1;
return B;
}
AVLTree RightRotation(AVLTree A)
{
AVLTree B = A->r;
A->r = B->l;
B->l = A;
A->height = max(Getheight(A->l),Getheight(A->r))+1;
B->height = max(A->height,Getheight(B->r))+1;
return B;
}
AVLTree LeftRightRotation(AVLTree A)
{
A->l = RightRotation(A->l);
return LeftRotation(A);
}
AVLTree RightLeftRotation(AVLTree A)
{
A->r = LeftRotation(A->r);
return RightRotation(A);
}
AVLTree Insert(AVLTree T,int x)
{
if(!T)
{
T = new AVLNode;
T->data = x;
T->height = 1;
T->l = T->r = NULL;
}
else if(x < T->data)
{
T->l = Insert(T->l,x);
if(Getheight(T->l)-Getheight(T->r) == 2)
{
if(x < T->l->data)
T = LeftRotation(T);
else
T = LeftRightRotation(T);
}
}
else if(x > T->data)
{
T->r = Insert(T->r,x);
if(Getheight(T->r)-Getheight(T->l) == 2)
{
if(x > T->r->data)
T = RightRotation(T);
else
T = RightLeftRotation(T);
}
}
T->height = max(Getheight(T->l),Getheight(T->r))+1;
return T;
}
int main()
{
int n;
while(cin >> n)
{
AVLTree T;
T = NULL;
while(n--)
{
int x;
cin >> x;
T = Insert(T,x);
}
cout << T->data <<endl;
}
//cout << "AC" <<endl;
return 0;
}