本题直白地考查纯粹的数据结构知识,根据模板实现AVL树即可。对AVL树及其例程的介绍,目前找到的最清晰、易懂、完整的是《数据结构与算法分析-C语言描述》。
// AVL 平衡二叉搜索树
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
struct AvlNode;
typedef struct AvlNode *AvlTree;
struct AvlNode
{
int Element;
AvlTree Left;
AvlTree Right;
int Height;
};
AvlTree SingleRotateWithLeft(AvlTree T);
AvlTree DoubleRotateWithLeft(AvlTree T);
AvlTree SingleRotateWithRight(AvlTree T);
AvlTree DoubleRotateWithRight(AvlTree T);
int getHeight(AvlTree T)
{
if (T == NULL)
{
return -1;
}
else
{
return T->Height;
}
}
AvlTree Insert(int x, AvlTree T)
{
if (T == NULL)
{
// Create and return a one-node tree
T = (AvlNode*)malloc(sizeof(AvlNode));
T->Element = x;
T->Height = 0;
T->Left = T->Right = NULL;
}
else if (x < T->Element)
{
T->Left = Insert(x, T->Left);
if (getHeight(T->Left) - getHeight(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 (getHeight(T->Right) - getHeight(T->Left) == 2)
{
if (x < T->Right->Element)
{
T = DoubleRotateWithRight(T);
}
else
{
T = SingleRotateWithRight(T);
}
}
}
T->Height = std::max(getHeight(T->Left), getHeight(T->Right)) + 1;
return T;
}
AvlTree SingleRotateWithLeft(AvlTree K2)
{
AvlTree K1;
K1 = K2->Left;
K2->Left = K1->Right;
K1->Right = K2;
K2->Height = std::max(getHeight(K2->Left), getHeight(K2->Right)) + 1;
K1->Height = std::max(getHeight(K1->Left), getHeight(K2)) + 1;
return K1;
}
AvlTree SingleRotateWithRight(AvlTree K1)
{
AvlTree K2;
K2 = K1->Right;
K1->Right = K2->Left;
K2->Left = K1;
K1->Height = std::max(getHeight(K1->Left), getHeight(K1->Right)) + 1;
K2->Height = std::max(getHeight(K2->Left), getHeight(K1)) + 1;
return K2;
}
AvlTree DoubleRotateWithLeft(AvlTree K3)
{
// Rotate between K1 and K2
K3->Left = SingleRotateWithRight(K3->Left);
// Rotate between K3 and K2
return SingleRotateWithLeft(K3);
}
AvlTree DoubleRotateWithRight(AvlTree K1)
{
// Rotate between K2 and K3
K1->Right = SingleRotateWithLeft(K1->Right);
// Rotate between K1 and K2
return SingleRotateWithRight(K1);
}
int main()
{
int N;
scanf("%d", &N);
AvlTree T = NULL;
for (int i = 0; i < N; i++)
{
int x;
scanf("%d", &x);
T = Insert(x, T);
}
printf("%d\n", T->Element);
return 0;
}