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.
![](https://i-blog.csdnimg.cn/blog_migrate/53d1b25e001121fbce282e9810229ff3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/29ebcd752e71db8af7bf56e7f79a5592.png)
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
个人分析:这道题考察平衡二叉搜索树的基本操作....就是一堆旋转,跟着我RR旋转,再LL旋转,再RL旋转,再LR旋转~~~emmmmm转都转晕了。。。。题目没有什么弯弯绕,把课件里的操作看看,就能依葫芦画瓢写完代码啦~~
上代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct AVLNode *AVLTree;
struct AVLNode{
int data;
AVLTree left;
AVLTree right;
int Height;
};
int GetHeight(AVLTree A)
{
if(!A)
return 0;
else
return A->Height;
}
int Max(int a,int b)
{
return a>b?a:b;
}
AVLTree SingleLeftRotation(AVLTree A)
{
AVLTree B=A->left;
A->left=B->right;
B->right=A;
A->Height=Max(GetHeight(A->left),GetHeight(A->right))+1;
B->Height=Max(GetHeight(B->left),A->Height)+1;
return B;
}
AVLTree SingleRightRotation(AVLTree A)
{
AVLTree B=A->right;
A->right=B->left;
B->left=A;
A->Height=Max(GetHeight(A->left),GetHeight(A->right))+1;
B->Height=Max(A->Height,GetHeight(B->right))+1;
return B;
}
AVLTree DoubleLeftRightRotation(AVLTree A)
{
A->left=SingleRightRotation(A->left);
return SingleLeftRotation(A);
}
AVLTree DoubleRightLeftRotation(AVLTree A)
{
A->right=SingleLeftRotation(A->right);
return SingleRightRotation(A);
}
AVLTree Insert(AVLTree T,int X)
{
if(!T)
{
T=(AVLTree)malloc(sizeof(struct AVLNode));
T->data=X;
T->Height=0;
T->left=T->right=NULL;
}
else if(X<T->data)
{
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);
}
}
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);
}
}
T->Height=Max(GetHeight(T->left),GetHeight(T->right))+1;
return T;
}
int main()
{
int number,i,Data;
AVLTree T=NULL;
scanf("%d",&number);
getchar();
for(i=0;i<number;i++)
{
scanf("%d",&Data);
T=Insert(T,Data);
}
printf("%d",T->data);
return 0;
}
测试结果:
总结:嗯,这道题居然是2013年浙大保研复试题,很强势啊,emmmmmmmmmmmmmmmmmmm....有一种“居然被我做出来了”的感觉。再接再厉呀!不过,时隔一个多月看这段代码,有些细节还是要反应一会,证明熟练度还很不够~继续努力啦