二叉排序树的创建查找与删除

本文介绍了一种二叉排序树的基本操作实现方法,包括创建、查找(递归与非递归)、删除等功能,并提供了完整的C语言源代码。通过本教程,读者可以了解二叉排序树的数据结构及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉排序树的创建查找与删除

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
	int data;
	struct Node *lch;
	struct Node *rch;
}BiNode, *BiTree;

void Creat(BiTree *T);                 //创建一个二叉排序树
void Insert(BiTree *T, int data);      //二叉排序树的插入
int Search1(BiTree *T, int number);    //查找,递归方法
int Search2(BiTree *T, int number);    //查找,非递归方法
BiTree Delete(BiTree T, int number);   //删除一个结点
BiTree iterates(BiTree T, int number); //找出要删除结点的前驱
void Inorder(BiTree T);                //中序遍历

int main(void)
{
	BiTree T;
	int number;

	Creat(&T);                         //创建一个二叉排序树
	Inorder(T);                        //中序遍历

/*	printf("请输入要查找的数:");
	scanf("%d",&number);
	if(Search1(T, number))             //查找,递归方法
		printf("查找成功!");
	else
		printf("查找失败!");
*/
	printf("请输入要查找的数:");
	scanf("%d",&number);
	if(Search2(T, number))             //查找,非递归方法
		printf("查找成功!");
	else
		printf("查找失败!");

	printf("请输入要删除的数:");
	scanf("%d",&number);
	T = Delete(T, number);             //删除一个结点
    Inorder(T);                        //中序遍历
	

	return 0;
}

void Creat(BiTree *T)                 //创建一个二叉排序树
{
	int data;

	*T = NULL;

	printf("请输入数据:");
	scanf("%d",&data);

	while(data != 1000)
	{
		Insert(T, data);

		printf("请输入数据:");
		scanf("%d",&data);
	}
}

void Insert(BiTree *T, int data)       //二叉排序树的插入
{
	BiTree s;

	if(*T == NULL)
	{
		s = (BiNode *)malloc(sizeof(BiNode));
		s->data = data;
		s->lch = s->rch = NULL;
		*T = s;
	}
	else if(data > (*T)->data)
		Insert(&((*T)->rch), data);
	else
		Insert(&((*T)->lch), data);
}

int Search1(BiTree T, int number)        //查找,递归方法
{
	if(!T)
		return 0;

	else if(number == T->data)	
		return 1;

	else if(T->lch == NULL && T->rch == NULL)//若一直搜索到最下面的叶子节点都没有则返回0
		return 0;

	else if(T->data > number)
		Search(T->lch, number);

	else 
		Search(T->rch, number);

}

int Search2(BiTree T, int number)          //查找,非递归方法
{
	BiTree p;

	p = T;

	while(p)
	{
		if(p->data == number)
			return 1;
		else if(p->lch == NULL && p->rch == NULL)
			return 0;
		else if(p->data > number)
			p = p->lch;
		else 
			p = p->rch;
	}
	return 0;
}

BiTree Delete(BiTree T, int number)    //删除一个结点
{
	BiNode *p, *w, *s;

	p = (BiNode *)malloc(sizeof(BiNode));
	p =T;

	if(!T)
	{
		printf("此树为空!");
		return T;
	}
	else if(!Search1(T, number))
	{
		printf("这个树中没有这个数!");
		return T;
	}
	else 
	{
		while(p->data == number)      //找到所要删除的结点
		{
			w = p;                    //w为所求结点的根结点

			if(p->data >number)
				p = p->lch;
			else
				p = p->rch;
		}
		if(p->lch == NULL && p->rch == NULL)//如果这个结点为叶子结点,则直接删除
		{
			free(p);     
		}
		else if(p->rch == NULL)             //如果所求结点只有左子树
		{
			if(w->rch == p)
				w->rch = p->lch;
			else
				w->lch = p->lch;
			free(p);
		}
		else if(p->lch == NULL)             //如果所求结点只有右子树
		{
			if(w->lch == p)
				w->rch = p->rch;
			else
				w->lch = p->rch;
			free(p);
		}
		else                              //所要删除的结点既有左子树又有右子树
		{
			s = iterates(T, number);      //s指向要删除结点的前驱结点
			if(w->lch == p)
			{
				w->lch = s;
				if(s->lch != NULL)
					s = s->lch;
			}
			else
			{
				w->rch = s;
				if(s->lch != NULL)
					s = s->lch;
			}

		}
	}
}

BiTree iterates(BiTree T, int number)   //找出要删除结点的前驱
{
	BiNode *p, *w;

	w = T;

	if(w->data == number)
	{
		p = w;

		iterates(T->lch, number);
		iterates(T->rch, number);
	}
	return p;
}

void Inorder(BiTree T)                 //中序遍历
{
	if(T)
	{
		Inorder(T->lch);

		printf("%d ", T->data);

		Inorder(T->	rch);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值