#include<stdio.h>
#include<stdlib.h>
typedef int elementtype;
typedef struct AVLNode *Position;
typedef Position AVLTree;
struct AVLNode{
elementtype data;
AVLTree left;
AVLTree right;
int H;
};
int max(int a,int b){
return a>b?a:b;
}
int GetH(AVLTree T);
AVLTree LL(AVLTree A);
AVLTree RR(AVLTree A);
AVLTree LR(AVLTree A);
AVLTree RL(AVLTree A);
AVLTree Insert(AVLTree T,int k);
int main(){
int N,k,i;
AVLTree T=NULL;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&k);
T=Insert(T,k);
}
printf("%d",T->data);
return 0;
}
int GetH(AVLTree b){
if(!b) return -1;
else return b->H;
}
AVLTree LL(AVLTree A){
AVLTree B=A->left;
A->left=B->right;
B->right=A;
A->H=max(GetH(A->left),GetH(A->right)) + 1;
B->H=max(GetH(B->left),A->H) + 1;
return B;
}
AVLTree RR(AVLTree A){
AVLTree B=A->right;
A->right=B->left;
B->left=A;
A->H=max(GetH(A->left),GetH(A->right))+1;
B->H=max(GetH(B->right),A->H)+1;
return B;
}
AVLTree LR(AVLTree A){
AVLTree B=A->left;
AVLTree C=B->right;
B->right=C->left;
C->left=B;
A->left=C->right;
C->right=A;
A->H=max(GetH(A->left),GetH(A->right))+1;
B->H=max(GetH(B->left),GetH(B->right))+1;
C->H=max(A->H,B->H)+1;
return C;
}
AVLTree RL(AVLTree A){
AVLTree B=A->right;
AVLTree C=B->left;
B->left=C->right;
C->right=B;
A->right=C->left;
C->left=A;
A->H=max(GetH(A->left),GetH(A->right))+1;
B->H=max(GetH(B->left),GetH(B->right))+1;
C->H=max(A->H,B->H)+1;
return C;
}
AVLTree Insert(AVLTree T,int k){
if(!T){
T=(AVLTree)malloc(sizeof(struct AVLNode));
T->data=k;
T->H=0;
T->left=T->right=NULL;
}else if(k<T->data){
T->left=Insert(T->left,k);
if(GetH(T->left)-GetH(T->right)==2){
if(k<T->left->data){
T=LL(T);
}else{
T=LR(T);
}
}
}else if(k>T->data){
T->right=Insert(T->right,k);
if(GetH(T->right)-GetH(T->left)==2){
if(k>T->right->data){
T=RR(T);
}else{
T=RL(T);
}
}
}
T->H=max(GetH(T->left),GetH(T->right))+1;
return T;
}
浙大版《数据结构(第2版)》题目集练习4.2 平衡二叉树的根 (25分)
最新推荐文章于 2022-04-16 21:52:42 发布