二叉平衡树树的实现

      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);
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值