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
#include <cstdio>
#include <cstdlib>
#include <algorithm>
//#define LOCAL
typedef struct node {
int data;
int height;
struct node* left;
struct node* right;
} Node, *tree;
int getHeight(tree root)
{
if (!root)
return 0;
return root->height;
}
void updateHeight(tree root)
{
root->height = std::max(getHeight(root->left), getHeight(root->right)) + 1;
}
int getBF(tree root)
{
return getHeight(root->left) - getHeight(root->right);
}
void L(tree& root)
{
tree tmp = root->right;
root->right = tmp->left;
tmp->left = root;
updateHeight(root);
updateHeight(tmp);
root = tmp;
}
void R(tree& root)
{
tree tmp = root->left;
root->left = tmp->right;
tmp->right = root;
updateHeight(root);
updateHeight(tmp);
root = tmp;
}
void insert(tree& root, int x)
{
if (!root) {
root = (tree)malloc(sizeof(Node));
root->data = x;
root->height = 1;
root->left = root->right = NULL;
}
else {
if (x < root->data) {
insert(root->left, x);
updateHeight(root);
if (getBF(root) == 2) {
if (getBF(root->left) == 1) {
R(root);
}
else if (getBF(root->left) == -1) {
L(root->left);
R(root);
}
}
}
else if (x > root->data) {
insert(root->right, x);
updateHeight(root);
if (getBF(root) == -2) {
if (getBF(root->right) == -1) {
L(root);
}
else if (getBF(root->right) == 1) {
R(root->right);
L(root);
}
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("test.txt", "r", stdin);
#endif
int N;
tree root = nullptr;
scanf("%d", &N);
while (N--) {
int temp;
scanf("%d", &temp);
insert(root, temp);
}
printf("%d\n", root->data);
return 0;
}
AVL的基本操作!