C语言二叉排序树

这篇博客介绍了二叉搜索树(BST)的基本操作,包括插入、删除和查找算法的实现。插入算法通过递归方式完成,根据节点值的大小决定插入左子树还是右子树。删除算法首先查找指定节点,然后根据节点是否有左右子节点进行不同的删除操作。查找算法则用于定位树中特定的节点。整个程序提供了用户交互界面,允许输入数据进行这些操作。

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

插入算法:

void InsertBFS(BSTree *a,Elemtype b)
{
	if(!(*a))//*如果树为空
	{
		BSTree c;
		c=(BSTree)malloc(sizeof(BSTNode));
		c->lchild=c->rchild=NULL;
		c->data=b;
		*a=c;
	}
	else if(b.key<(*a)->data.key)//*如果插入的结点小于树结点
	{
		InsertBFS(&(*a)->lchild,b);//*插入左子树
	}
	else
	{
		InsertBFS(&(*a)->rchild,b);//*插入右子树
	}
}

删除算法:

void DeleteBFS(BSTree *a,KeyType key)
{
	BSTree f,p,q,s;
	p=*a;//**p指向根节点
	f=NULL;
	while(p)//*查找数据,使*p指向正确的结点
	{
		f=p;
		if(key<p->data.key)//*如果被删除结点小于*p,则让*p指向左子树
		{
			p=p->lchild;
		}
		else if(key>p->data.key)
		{
			p=p->rchild;//*指向右子树
		}
		else
		{
			break;//*如果查找成功
		}
	}
	if(!p)//*如果结点不存在
	{
		printf("删除失败!\n");
		return;
	}
	q=p;
	if((p->lchild)&&(p->rchild))
	{
		s=p->lchild;
		while(s->rchild)
		{
			q=s;
			s=s->rchild;
		}
		p->data=s->data;
		if(q!=p)//*如果*s的前驱不为*p
		{
			q->rchild=s->lchild;//*重接右子树
		}
		else
		{
			q->lchild=s->lchild;//*重接左子树
		}
		free(s);
		return;
	}
	else if(!p->lchild)
	{
		p=p->rchild;
	}
	else if(!p->rchild)
	{
		p=p->lchild;
	}
	if(!f)
	{
		*a=p;
	}
	else if(q==f->lchild)
	{
		f->lchild=p;
	}
	else
	{
		f->rchild=p;
	}
	free(q);
}

查找算法:

BSTree Print_cha(BSTree a,KeyType key)
{
	if((!a)||(a->data.key==key))//*如果查找到或结点不存在
	{
		return a;
	}
	else if(key<a->data.key)
	{
		return Print_cha(a->lchild,key);
	}
	else
	{
		return Print_cha(a->rchild,key);
	}
}

整体算法如下:

#include <stdio.h>
#include <stdlib.h>
typedef long long int KeyType;
typedef int Infotype;
typedef struct
{
	KeyType key;
	Infotype otherinfo;
}Elemtype;
typedef struct BSTNode
{
	Elemtype data;
	struct BSTNode *lchild,*rchild; 
}BSTNode,*BSTree;
void InsertBFS(BSTree *a,Elemtype b)
{
	if(!(*a))
	{
		BSTree c;
		c=(BSTree)malloc(sizeof(BSTNode));
		c->lchild=c->rchild=NULL;
		c->data=b;
		*a=c;
	}
	else if(b.key<(*a)->data.key)
	{
		InsertBFS(&(*a)->lchild,b);
	}
	else
	{
		InsertBFS(&(*a)->rchild,b);
	}
}
void CreateBFS(BSTree *a,KeyType end_flag)
{
	KeyType key;
	printf("请输入您要插入的数据:");
	scanf("%lld",&key);
	fflush(stdin);
	while(key!=end_flag)
	{
		Elemtype data;
		data.key=key;
		data.otherinfo=rand();
		InsertBFS(a,data);
		printf("请输入您要插入的数据:");
	    scanf("%lld",&key);
	    fflush(stdin);
	}
}
void DeleteBFS(BSTree *a,KeyType key)
{
	BSTree f,p,q,s;
	p=*a;
	f=NULL;
	while(p)
	{
		f=p;
		if(key<p->data.key)
		{
			p=p->lchild;
		}
		else if(key>p->data.key)
		{
			p=p->rchild;
		}
		else
		{
			break;
		}
	}
	if(!p)
	{
		printf("删除失败!\n");
		return;
	}
	q=p;
	if((p->lchild)&&(p->rchild))
	{
		s=p->lchild;
		while(s->rchild)
		{
			q=s;
			s=s->rchild;
		}
		p->data=s->data;
		if(q!=p)
		{
			q->rchild=s->lchild;
		}
		else
		{
			q->lchild=s->lchild;
		}
		free(s);
		return;
	}
	else if(!p->lchild)
	{
		p=p->rchild;
	}
	else if(!p->rchild)
	{
		p=p->lchild;
	}
	if(!f)
	{
		*a=p;
	}
	else if(q==f->lchild)
	{
		f->lchild=p;
	}
	else
	{
		f->rchild=p;
	}
	free(q);
}
void Delete(BSTree *a,KeyType end_flag)
{
	KeyType key;
	printf("请输入您要删除的数据:");
	scanf("%lld",&key);
	fflush(stdin);
	while(key!=end_flag)
	{
		DeleteBFS(a,key);
		printf("请输入您要删除的数据:");
	    scanf("%lld",&key);
	    fflush(stdin);
	}
}
BSTree Print_cha(BSTree a,KeyType key)
{
	if((!a)||(a->data.key==key))
	{
		return a;
	}
	else if(key<a->data.key)
	{
		return Print_cha(a->lchild,key);
	}
	else
	{
		return Print_cha(a->rchild,key);
	}
}
void Print(BSTree a,KeyType end_flag)
{
	KeyType key;
	printf("请输入您要插入的数据:");
	scanf("%lld",&key);
	fflush(stdin);
	while(key!=end_flag)
	{
		BSTree data;
		data=Print_cha(a,key);
		if(!data)
		{
			printf("NULL!\n");
		}
		else
		{
			printf("%lld->%d\n",data->data.key,data->data.otherinfo);
		}
		printf("请输入您要插入的数据:");
	    scanf("%lld",&key);
	    fflush(stdin);
	}
}
main()
{
	srand((unsigned)time(NULL));
	BSTree a=NULL;
	for(;;)
	{
		printf("1.查询\n2.插入\n3.删除\n4.按其他键退出\n");
		char b=getch();
		if((b>'3')||(b<'1'))
		{
			return 0;
		}
		else
		{
			KeyType end_flag;
			printf("请输入结束标志:");
			scanf("%lld",&end_flag);
			fflush(stdin);
			switch(b)
			{
				case '1':Print(a,end_flag);break;
				case '2':CreateBFS(&a,end_flag);break;
				case '3':Delete(&a,end_flag);break;
			}
		}
	} 
}

程序运行如下: 

1.查询
2.插入
3.删除
4.按其他键退出
请输入结束标志:2
请输入您要插入的数据:5
请输入您要插入的数据:2
1.查询
2.插入
3.删除
4.按其他键退出
请输入结束标志:
10
请输入您要插入的数据:5
5->6430
请输入您要插入的数据:10
1.查询
2.插入
3.删除
4.按其他键退出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值