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
个人分析:这道题考察平衡二叉搜索树的基本操作....就是一堆旋转,跟着我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....有一种“居然被我做出来了”的感觉。再接再厉呀!不过,时隔一个多月看这段代码,有些细节还是要反应一会,证明熟练度还很不够~继续努力啦