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>
#include<string>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
struct Tnode {
int val;
Tnode *left, *right;
};
int n;
Tnode *leftrotate(Tnode *tree){
Tnode *tmp = tree->right;
tree->right = tmp->left;
tmp->left = tree;
return tmp;
};
Tnode *rightrotate(Tnode *tree){
Tnode *tmp = tree->left;
tree->left = tmp->right;
tmp->right = tree;
return tmp;
};
Tnode *leftrightrotate(Tnode *tree){
tree->left = leftrotate(tree->left);
return rightrotate(tree);
};
Tnode *rightleftrotate(Tnode *tree){
tree->right = rightrotate(tree->right);
return leftrotate(tree);
};
int geth(Tnode *tree) {
if (tree == NULL) return 0;
int l = geth(tree->left);
int r = geth(tree->right);
return max(l, r) + 1;
}
Tnode *buildtree(Tnode *tree, int val) {
if (tree == NULL) {
tree = new Tnode();
tree->val = val;
}
else {
if (val > tree->val) {
tree->right = buildtree(tree->right, val);
int l = geth(tree->left);
int r = geth(tree->right);
if (r - l > 1) {
if (val > tree->right->val) tree = leftrotate(tree);
else tree = rightleftrotate(tree);
}
}
else {
tree->left = buildtree(tree->left, val);
int l = geth(tree->left);
int r = geth(tree->right);
if (l - r > 1) {
if (val < tree->left->val) tree = rightrotate(tree);
else tree = leftrightrotate(tree);
}
}
}
return tree;
}
int main() {
cin >> n;
Tnode *tree = NULL;
for (int i = 0; i < n; i++) {
int t1;
scanf("%d", &t1);
tree = buildtree(tree, t1);
}
printf("%d\n", tree->val);
return 0;
}