C语言二叉排序树

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

插入算法:

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.按其他键退出

要创建一个二叉排序树(Binary Search Tree,BST)的话,你需要实现以下几个关键步骤: 1. 首先,你需要定义二叉树节点的结构。每个节点应该包含一个数据元素,以及指向左子节点和右子节点的指针。 ```c typedef struct Node { int data; struct Node* left; struct Node* right; } Node; ``` 2. 创建一个函数来插入节点到二叉排序树中。这个函数应该接收一个指向根节点的指针和待插入的数据。如果根节点为空,表示树为空,你可以直接将新节点作为根节点。否则,你需要按照 BST 的规则找到合适的位置插入新节点。 ```c void insert(Node** root, int data) { if (*root == NULL) { *root = createNode(data); return; } if (data < (*root)->data) { insert(&(*root)->left, data); } else { insert(&(*root)->right, data); } } ``` 3. 创建一个函数来创建新的节点。 ```c Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } ``` 4. 最后,你可以编写一个函数来遍历并打印二叉排序树中的所有节点,以验证是否正确创建了二叉排序树。 ```c void inorderTraversal(Node* root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } } ``` 这样,你就可以使用上述代码来创建和操作二叉排序树了。记得在程序结束后释放节点的内存空间,以避免内存泄漏。 希望这能帮到你!如有疑问,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值