将给定的一系列数字插入初始为空的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 <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, ElementType X);
int main() {
int N, K, i;
AVLTree T = NULL; //建立空的AVL树
scanf("%d", &N);
for (i = 0; i < N; i++) {
scanf("%d", &K);
T = Insert(T, K);
}
printf("%d\n", T->Data); //打印根节点
return 0;
}
int GetH(AVLTree T) {
if (T) return T->H;
else return -1;
}
AVLTree LL(AVLTree A) {
//A必须有左儿子B
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) {
//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;
A->Left = C->Right;
C->Left = B;
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(B->H, A->H) + 1;
return C;
}
AVLTree RL(AVLTree A) {
AVLTree B = A->Right;
AVLTree C = B->Left;
B->Left = C->Right;
A->Right = C->Left;
C->Left = A;
C->Right = B;
A->H = Max(GetH(A->Right), GetH(A->Left)) + 1;
B->H = Max(GetH(B->Right), GetH(B->Left)) + 1;
C->H = Max(A->H, B->H) + 1;
return C;
}
AVLTree Insert(AVLTree T, ElementType X) {
//将X插入avl树中,并返回新的树
if (!T) {
//若插入空树,则新建一个包含一个节点的树
T = (AVLTree)malloc(sizeof(struct AVLNode));
T->Data = X;
T->H = 0;
T->Right = T->Left = NULL;
}
else if (X < T->Data) {
//插入T的左子树
T->Left = Insert(T->Left, X);
//如果需要左旋
if (GetH(T->Left) - GetH(T->Right) == 2)
if (X < T->Left->Data)
T = LL(T); //左单旋
else
T = LR(T); //左右双旋
}
else if (X > T->Data) {
//插入T的右子数
T->Right = Insert(T->Right, X);
//如果需要右旋
if (GetH(T->Left) - GetH(T->Right) == -2)
if (X > T->Right->Data)
T = RR(T); //又单旋
else
T = RL(T); //右左单旋
}
//更新树高
T->H = Max(GetH(T->Left), GetH(T->Right)) + 1;
return T;
}