将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。
输入格式:
输入的第一行给出一个正整数N(≤20),随后一行给出N个不同的整数,其间以空格分隔。
输出格式:
在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。
输入样例1:
5
88 70 61 96 120
输出样例1:
70
输入样例2:
7
88 70 61 96 120 90 65
输出样例2:
88
代码实现
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef int ElementType;
typedef struct AVLNode* Position;
typedef Position AVLTree;
typedef struct AVLNode{
ElementType Data;
AVLTree Left;
AVLTree Right;
};
//计算树高
int GetHeight(AVLTree A){
int HL,HR,MaxH;
if(A==NULL)
return 0;
else{
HL=GetHeight(A->Left);
HR=GetHeight(A->Right);
MaxH=max(HL,HR);
return (MaxH+1);
}
}
//左单旋(顺时针)
AVLTree SingleLeftRotation(AVLTree A){
AVLTree B=A->Left;
A->Left=B->Right;
B->Right=A;
return B;
}
//右单旋(逆时针)
AVLTree SingleRightRotation(AVLTree A){
AVLTree B=A->Right;
A->Right=B->Left;
B->Left=A;
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 A,ElementType X){
if(!A){
A=(AVLTree)malloc(sizeof(struct AVLNode));
A->Data=X;
A->Left=A->Right=NULL;
}
else if(X<A->Data){
A->Left=Insert(A->Left,X);
if(GetHeight(A->Left)-GetHeight(A->Right)==2)
if(X<A->Left->Data)
A=SingleLeftRotation(A);
else
A=DoubleLeftRightRotation(A);
}
else if(X>A->Data){
A->Right=Insert(A->Right,X);
if(GetHeight(A->Left)-GetHeight(A->Right)==-2)
if(X>A->Right->Data)
A=SingleRightRotation(A);
else
A=DoubleRightLeftRotation(A);
}
return A;
}
/*验证:输出函数见树的递归输出博客*/
int main(){
AVLTree A=NULL;
int n,t;
cin>>n;
for(int i=0;i<n;i++){
cin>>t;
A=Insert(A,t);
}
cout<<A->Data<<endl;
return 0;
}