查找二叉树的操作

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct TreeNode *SearchTree;
typedef struct TreeNode *position;
struct TreeNode
{
	Elemtype Element;
	SearchTree Left;
	SearchTree Right;
};

/*建立一颗空树*/
SearchTree MakeEmpty(SearchTree T)
{
	if(T != NULL)
	{
		MakeEmpty(T->Left);
		MakeEmpty(T->Right);
		free(T);
	}
	return NULL;
}

/*查找树中最小的值所在的位置*/
position FindMin(SearchTree T)
{
	if(T == NULL)
		return NULL;
	if(T->Left)
		return FindMin(T->Left);
	else
		return T;
}

/*查找树中最大的值所在的位置*/
position FindMax(SearchTree T)
{
	if(T == NULL)
		return NULL;
	if(T->Right)
		return T->Right;
	else
		return T;
}

/*插入结点*/
SearchTree Insert(SearchTree T,Elemtype x)
{
	if(T == NULL)
	{
		T = (SearchTree)malloc(sizeof(struct TreeNode));
		if(!T)
		{
			printf("Out of space\n");
			exit(1);
		}
		T->Element = x;
		T->Left = T->Right = NULL;
	}
	else
	{
		if(x > T->Element)
			T->Right = Insert(T->Right,x);
		else if(x < T->Element)
			T->Left = Insert(T->Left,x);
	}
	return T;
}

/*删除结点*/
SearchTree Delete(SearchTree T,Elemtype x)
{
	if(T == NULL)
		printf("Element not found\n");
	else if(x < T->Element)
		T->Left = Delete(T->Left,x);
	else if(x > T->Element)
		T->Right = Delete(T->Right,x);
	else
	{
		if(T->Left&&T->Right)
		{
			T = FindMax(T->Right);              
			Delete(T->Right,T->Element);
		}
		else
		{
			SearchTree TmpNode;
			TmpNode = T;
			if(T->Left)
				T = T->Left;
			else
				T = T->Right;
			free(TmpNode);
		}
	}
	return T;
}

/*中序输出查找二叉树*/
void PrintSearchTree(SearchTree T)
{
	if(T->Left)
		PrintSearchTree(T->Left);
	if(T)
		printf("%d ",T->Element);
	if(T->Right)
		PrintSearchTree(T->Right);
}
/*测试*/
int main(void)
{
	int n;
	SearchTree T = NULL;
	T = MakeEmpty(T);
	while(scanf("%d",&n)!=EOF)
	{   if(n == 0)
			break;
		T = Insert(T,n);
	}
	PrintSearchTree(T);
	printf("\n输去你想删除的结点\n");
	scanf("%d",&n);
	T = Delete(T,n);
	PrintSearchTree(T);

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值