AVL树的具体概念这里不做介绍,可参考AVL,只给出代码构建AVL树的代码实现(基于《数据结构与算法分析——C语言版》)
#include <stdio.h>
#include <stdlib.h>
struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
typedef int ElementType;
struct AvlNode{
ElementType Data;
AvlTree Left;
AvlTree Right;
int Height;
};
AvlTree MakeEmpty(AvlTree T);
Position Find(ElementType X, AvlTree T);
Position FindMin(AvlTree T);
Position FindMax(AvlTree T);
AvlTree Insert(ElementType X, AvlTree* T);
AvlTree Delete(ElementType X, AvlTree T);
int Retrive(Position P);
static int Height(Position P);
static Position SingleRotateLeft(Position K2);
static Position SingleRotateRight(Position K1);
static Position DoubleRotateLeft(Position K3);
static Position DoubleRotateRight(Position K3);
int Max(int A, int B);
void PostPrint(AvlTree T);
int main(){
int a[10] = { 10, -1, 22, 13, 5, -4, 23, 6, 14, 9 };
AvlTree T = NULL;
int i;
for (i = 0; i < 10; i++){
Insert(a[i], &T);
}
PostPrint(T);
printf("\n");
MakeEmpty(T);
return 0;
}
AvlTree MakeEmpty(AvlTree T){
if (T != NULL){
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
static int Height(Position P){
if (P == NULL)
return -1;
else
return P->Height;
}
AvlTree Find(ElementType X, AvlTree T){
if (T == NULL)
return NULL;
if (X < T->Data)
return Find(X, T->Left);
else if (X>T->Data)
return Find(X, T->Right);
else
return T;
}
AvlTree FindMin(AvlTree T){
if (T == NULL)
return NULL;
else if (T->Left == NULL)
return T;
else
return FindMin(T->Left);
}
AvlTree FindMax(AvlTree T){
if (T != NULL){
while (T->Right != NULL)
T = T->Right;
}
return T;
}
static Position SingleRotateLeft(Position K2){
Position K1;
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), K2->Height) + 1;
return K1;
}
static Position SingleRotateRight(Position K1){
Position K2;
K2 = K1->Right;
K1->Right = K1->Left;
K2->Left = K1;
K1->Height = Max(Height(K1->Left), Height(K1->Right)) + 1;
K2->Height = Max(K1->Height, Height(K2->Right)) + 1;
return K2;
}
static Position DoubleRotateLeft(Position K3){
K3->Left = SingleRotateRight(K3->Left);
return SingleRotateLeft(K3);
}
static Position DoubleRotateRight(Position K3){
K3->Right = SingleRotateLeft(K3->Left);
return SingleRotateRight(K3);
}
AvlTree Insert(ElementType X, AvlTree* T){
if (*T == NULL){
*T = (AvlTree) malloc(sizeof(struct AvlNode));
if (*T == NULL)
exit(1);
else{
(*T)->Data = X;
(*T)->Height = 0;
(*T)->Left = (*T)->Right = NULL;
}
}
else if (X<(*T)->Data){
(*T)->Left = Insert(X, &(*T)->Left);
if (Height((*T)->Left) - Height((*T)->Right) == 2){
if (X < (*T)->Left->Data)
*T = SingleRotateLeft(*T);
else
*T = DoubleRotateLeft(*T);
}
}
else if (X>(*T)->Data){
(*T)->Right = Insert(X, &(*T)->Right);
if (Height((*T)->Right) - Height((*T)->Left) == 2){
if (X > (*T)->Right->Data)
*T = SingleRotateRight(*T);
else
*T = DoubleRotateRight(*T);
}
}
(*T)->Height = Max(Height((*T)->Left), Height((*T)->Right)) + 1;
return *T;
}
int Max(int A, int B){
return A > B ? A : B;
}
void PostPrint(AvlTree T){
if (T == NULL)
return;
else{
PostPrint(T->Left);
printf("%d ", T->Data);
PostPrint(T->Right);
}
}