#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct AvlNode *AvlTree;
typedef struct AvlNode *Position;
struct AvlNode
{
ElementType Element;
AvlTree Left;
AvlTree Right;
int Height;
};
AvlTree Insert(ElementType X, AvlTree T);
ElementType Retrieve(Position P);//通过位置P检索元素
///
int height(Position P);
Position SingleRotateWithleft(Position K2);
Position SingleRotatewithRight(Position K2);
Position DoubleRotateWithleft(Position K3);
Position DoubleRotateWithRight(Position K3);
int Max(int Value1, int Value2);
///
int main()
{
int N;
scanf("%d",&N);
int Value;
AvlTree T = NULL;
while (N--) {
scanf("%d",&Value);
T = Insert(Value, T);
}
if (T) {
printf("%d\n", T->Element);
}
return 0;
}
AvlTree Insert(ElementType X, AvlTree T)
{
if (T == NULL) {
//Creat and return a one-node tree
T = malloc(sizeof(struct AvlNode));
T->Element = X;
T->Left = T->Right = NULL;
T->Height = 0;
}else if (X < T->Element)
{
T->Left = Insert(X, T->Left);
if (height(T->Left) - height(T->Right) == 2) {
if (X < T->Left->Element) {
T = SingleRotateWithleft(T);
}else
{
T = DoubleRotateWithleft(T);
}
}
}else if (X > T->Element)
{
T->Right = Insert(X, T->Right);
if (height(T->Right) - height(T->Left) == 2) {
if (X > T->Right->Element) {
T = SingleRotatewithRight(T);
}else
{
T = DoubleRotateWithRight(T);
}
}
}
//Eles X is in the tree already; we'll do nothing
T->Height = Max(height(T->Left), height(T->Right))+1;
return T;
}
int height(Position P)
{
if (P == NULL) {
return -1;
}else
{
return P->Height;
}
}
Position SingleRotateWithleft(Position K2)
{
Position K1 = K2->Left;
K2->Left = K1->Right;
K1->Right = K2;
K2->Height = Max(height(K2->Left), height(K2->Right))+1;
K1->Height = Max(height(K1->Left), height(K1->Right))+1;
return K1;
}
Position SingleRotatewithRight(Position K1)
{
Position K2 = K1->Right;
K1->Right = K2->Left;
K2->Left = K1;
K1->Height = Max(height(K1->Left), height(K1->Right))+1;
K2->Height = Max(height(K2->Left), height(K2->Right))+1;
return K2;
}
Position DoubleRotateWithleft(Position K3)
{
K3->Left = SingleRotatewithRight(K3->Left);
return SingleRotateWithleft(K3);
}
Position DoubleRotateWithRight(Position K3)
{
K3->Right = SingleRotateWithleft(K3->Right);
return SingleRotatewithRight(K3);
}
int Max(int Value1, int Value2)
{
return Value1 > Value2 ? Value1 : Value2;
}