二叉查找树(AVL形式)

//二叉AVL查找树

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

#define ElementType int

struct AvlNode;
typedef struct AvlNode *AvlTree;
typedef struct AvlNode *Position;

//AvlTree means find a root plus,Position means return a plus in position.
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);

//fuction
int Height(Position P);//return plus's height to balance the tree
int Max(int x,int y);

//Rotate
Position SingleRotateWithLeft(Position P);
Position SingleRotateWithRight(Position P);
Position DoubleRotateWithLeft(Position P);
Position DoubleRotateWithRight(Position P);

struct AvlNode
{
	ElementType Element;
	AvlTree left;
	AvlTree right;
	int height;//how much meter?laugh~~
};

int Height(Position P)
{
	if(P==NULL)
		return -1;
	else
		return P->height;
}

int Max(int x,int y)
{
	if(x>=y)
		return x;
	else
		return y;
}

AvlTree Insert(ElementType X,AvlTree T)
{
	if(T==NULL)
	{
		T=(AvlTree)malloc(sizeof(struct AvlNode));
		if(T==NULL)
			printf("OUT OF SPACE!\n");
		else
		{
			T->Element=X;
			T->height=0;
			T->left=NULL;
			T->right=NULL;
		}
	}
	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);
		}
	}
	//there not x==Element phonemeon
	T->height=Max(Height(T->left),Height(T->right))+1;
	return T;
}


Position SingleRotateWithLeft(Position P)
{
	Position tmp;
	tmp=P->left;
	P->left=tmp->right;
	tmp->right=P;
	P->height=Max(Height(P->left),Height(P->right))+1;
	tmp->height=Max(Height(tmp->left),Height(tmp->right))+1;
	return tmp;
}

Position SingleRotateWithRight(Position P)
{
	Position tmp;
	tmp=P->right;
	P->right=tmp->left;
	tmp->left=P;
	P->height=Max(Height(P->left),Height(P->right))+1;
	tmp->height=Max(Height(tmp->left),Height(tmp->right))+1;
	return tmp;
}

Position DoubleRotateWithLeft(Position P)
{
	P->left=SingleRotateWithRight(P->left);
	return SingleRotateWithLeft(P);
}

Position DoubleRotateWithRight(Position P)
{
	P->right=SingleRotateWithLeft(P->right);
	return SingleRotateWithRight(P);
}

Position Find(ElementType X,AvlTree T)
{
	if(T==NULL)
		return NULL;
	else if(X<T->Element)
		return Find(X,T->left);
	else if(X>T->Element)
		return Find(X,T->right);
	else
		return T;
}

Position FindMin(AvlTree T)
{
	if(T==NULL)
		return NULL;
	else if(T->left==NULL)
		return T;
	else
		return FindMin(T->left);
}

Position FindMax(AvlTree T)
{
	if(T==NULL)
		return NULL;
	else if(T->right==NULL)
		return T;
	else
		return FindMax(T->right);
}

AvlTree Delete(ElementType X,AvlTree T)
{
	Position TmpCell;
	if(T==NULL)
		printf("You can't delete a NULL Tree\n");
	else if(X<T->Element)
		T->left=Delete(X,T->left);
	else if(X>T->Element)
		T->right=Delete(X,T->right);
	else
	{
		if(T->left && T->right)
		{
			TmpCell=FindMin(T->right);
			T->Element=TmpCell->Element;
			T->right=Delete(T->Element,T->right);
		}
		else
		{
			TmpCell=T;
			if(T->left==NULL)
				T=T->right;
			else if(T->right==NULL)
				T=T->left;
			free(TmpCell);
		}
	}
	return T;
}

int main()
{
	AvlTree T=NULL;
	int n;
	int i;
	for(i=0;i<5;i++)
	{
		scanf("%d",&n);
		T=Insert(n,T);
	}
	Position tmp;
	int max;
	int min;
	tmp=FindMax(T);
	max=tmp->Element;
	tmp=FindMin(T);
	min=tmp->Element;
	printf("Max=%d Min=%d\n",max,min);
	tmp=Delete(max,T);
	max=FindMax(tmp)->Element;
	printf("Max=%d Min=%d\n",max,min);
	return 0;
}
/*
示例输入
INPUT
3 1 2 4 5
OUTPUT
Max=5 Min=1
Max=4 Min=1
Press any key to continue
*/




转载复制请说明出处。谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值