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<stdio.h>
#include<stdlib.h>
#define N 30
typedef struct node* tree;
typedef struct node{
int data;
int height;
tree left;
tree right;
};
tree quene[N];
int tail = 0, head = 0;//队列头尾指针
int max(int a, int b){
return a>b ? a : b;
}
int getHeight(tree t){
if(t == NULL){
return -1;
}else{
return t->height;
}
}
tree LL(tree K) {
tree Tmp;
Tmp = K;
K = K->left;
Tmp->left = K->right;
K->right = Tmp;
Tmp->height = max(getHeight(Tmp->left), getHeight(Tmp->right)) + 1;
K->height = max(getHeight(K->left), getHeight(K->right)) + 1;
return K;
}
tree RR(tree K) {
tree Tmp;
Tmp = K;
K = K->right;
Tmp->right = K->left;
K->left = Tmp;
Tmp->height = max(getHeight(Tmp->left), getHeight(Tmp->right)) + 1;
K->height = max(getHeight(K->left), getHeight(K->right)) + 1;
return K;
}
tree LR(tree K) {
K->left = RR(K->left);
return LL(K);
}
tree RL(tree K) {
K->right = LL(K->right);
return RR(K);
}
tree insert(tree AVL, int x){
if(AVL == NULL){
AVL = (tree)malloc(sizeof(tree));
AVL->data = x;
AVL->height = 0;
AVL->left = NULL;
AVL->right = NULL;
}else if(x < AVL->data){
AVL->left = insert(AVL->left, x);
if(getHeight(AVL->left) - getHeight(AVL->right)==2){
//如果插入结束后,左右子树不平衡
if(x > AVL->left->data){
AVL = LR(AVL);
} else{
AVL = LL(AVL);
}
}
}else{
AVL->right = insert(AVL->right, x);
if(getHeight(AVL->right) - getHeight(AVL->left)==2){
//如果插入结束后,左右子树不平衡
if(x > AVL->right->data){
AVL = RR(AVL);
} else{
AVL = RL(AVL);
}
}
}
AVL->height = max(getHeight(AVL->left), getHeight(AVL->right))+1;
return AVL;
}
void push(tree t){
quene[tail++] = t;
return ;
}
tree pop(){
return quene[head++];
}
int main(){
int n;
tree AVL = NULL;
scanf("%d",&n);
for(int i = 0; i < n; i++){
int tmp;
scanf("%d",&tmp);
AVL = insert(AVL, tmp);
}
/* //层次遍历--队列
push(AVL);
while(1){
tree t = pop();
printf("%d",t->data);
if(t->left!=NULL){
push(t->left);
}
if(t->right!=NULL)
push(t->right);
if(tail == head){
break;
}
printf(" ");
}
printf("\n");
*/
printf("%d\n",AVL->data);
}