04-树3. 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.
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 ythe root of the resulting AVL tree in one line.
Sample Input 1:5 88 70 61 96 120Sample Output 1:
70Sample Input 2:
7 88 70 61 96 120 90 65Sample Output 2:
88
AVL的测试水题,逻辑没有问题。 。关键还是记代码或者说背代码,(LL,RR,LR,RL)-->AVL。add oil!背背背!!
#include<stdio.h>
#include<stdlib.h>
typedef struct avl{
int data;
struct avl* left;
struct avl* right;
int hign;
}AVL;
int Max(int a,int b);
int GetHeight(AVL* BT);
AVL* insert(int x,AVL* T);
AVL* RightRotation(AVL* A);
AVL* LeftRotation(AVL* A);
AVL* RightLeftRotation(AVL* A);
AVL* LeftRightRotation(AVL* A);
int main(){
int n,i,k;
scanf("%d",&n);
AVL* avlT = NULL;
for(i = 0;i<n;i++){
scanf("%d",&k);
avlT = insert(k,avlT);
}
printf("%d",avlT->data);
return 0;
}
AVL* insert(int x,AVL* T){
if(T == NULL){
T = (AVL*)malloc(sizeof(AVL));
T->data = x;
T->left = T->right = NULL;
T->hign = 0;
}
else if(x<T->data){
T->left = insert(x,T->left);
if(2 == GetHeight(T->left) - GetHeight(T->right))
// 左旋
if(x<T->left->data)
// LL
T = LeftRotation(T);
else
// LR
T = LeftRightRotation(T);
}
else if(x>T->data){
T->right = insert(x,T->right);
if(2 == GetHeight(T->right) - GetHeight(T->left))
// 右旋
if(x>T->right->data)
// RR
T = RightRotation(T);
else
// RL
T = RightLeftRotation(T);
}
T->hign = Max(GetHeight(T->left),GetHeight(T->right))+1;
return T;
}
int Max(int a,int b){
if(a>b)
return a;
else
return b;
}
AVL* LeftRotation(AVL* A){
AVL* B = A->left;
A->left = B->right;
B->right = A;
A->hign = Max(GetHeight(A->left),GetHeight(A->right)) + 1;
B->hign = Max(GetHeight(B->left),A->hign) + 1;
return B;
}
AVL* RightRotation(AVL* A){
AVL* B = A->right;
A->right = B->left;
B->left = A;
A->hign = Max(GetHeight(A->left),GetHeight(A->right)) + 1;
B->hign = Max(GetHeight(B->left),A->hign) + 1;
return B;
}
AVL* LeftRightRotation(AVL* A){
A->left = RightRotation(A->left);
return LeftRotation(A);
}
AVL* RightLeftRotation(AVL* A){
A->right = LeftRotation(A->right);
return RightRotation(A);
}
int GetHeight(AVL* BT){
int HL,HR,MaxH;
if(BT!=NULL){
HL = GetHeight(BT->left);
HR = GetHeight(BT->right);
MaxH = HL > HR ? HL : HR;
return MaxH+1;
}
else
return 0;
}