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

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

#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);
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉排序树(Binary Search Tree,简称BST)是一种特殊的二叉树,它的左子树中所有节点的值都小于根节点的值,右子树中所有节点的值都大于根节点的值。因此,通过比较节点值的大小关系,可以在二叉排序树中进行高效的查找、插入和删除操作。 创建二叉排序树: 1. 对于空树,直接将新节点作为根节点。 2. 对于非空树,从根节点开始比较新节点的值与当前节点的值的大小关系,如果小于当前节点的值,则将新节点插入到当前节点的左子树中;如果大于当前节点的值,则将新节点插入到当前节点的右子树中。 查找二叉排序树: 从根节点开始比较要查找的值与当前节点的值的大小关系,如果相等则返回当前节点;如果小于当前节点的值,则在当前节点的左子树中查找;如果大于当前节点的值,则在当前节点的右子树中查找。如果遍历到叶子节点仍未找到,则说明要查找的值不存在于二叉排序树中。 插入节点: 从根节点开始比较要插入的节点的值与当前节点的值的大小关系,如果小于当前节点的值,则在当前节点的左子树中插入;如果大于当前节点的值,则在当前节点的右子树中插入。如果遍历到叶子节点仍未找到合适的位置,则将新节点作为当前节点的左子节点或右子节点。 删除节点: 1. 如果要删除的节点是叶子节点,则直接删除。 2. 如果要删除的节点只有一个子节点,则将其子节点替换为要删除的节点。 3. 如果要删除的节点有两个子节点,则找到其右子树中的最小节点(或左子树中的最大节点),将其值替换为要删除的节点的值,然后删除最小节点。 以上就是二叉排序树创建查找、插入和删除操作的基本思路。需要注意的是,在实现过程中需要考虑到各种边界情况和特殊情况,以保证程序的正确性和鲁棒性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值