二叉排序树3

本文介绍了二叉排序树的定义,强调了输入数据必须遵循的规则。讨论了二叉搜索树的操作,包括创建、插入、删除节点,并指出删除操作的难点。提到了在删除节点时的特殊情况处理。此外,提供了前两篇相关文章的链接以供深入学习。

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

欢迎进入@shuai:二叉排序树3;

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
#define size 100
typedef struct tree{
	int data;
	struct tree *l,*r;
}tree;
tree* isno(){
	int n;
	tree *bt;
	bt=(tree*)malloc(sizeof(tree));
	printf("请输入根节点(0表示空)");
	scanf("%d",&n);
	if(n==0){
	printf("次树为空");
	exit(0); 
}
    else{
    	bt->data=n;
    	bt->l=0;
    	bt->r=0;
	}
	return bt;
}
creat(tree *bt){
	int n;
	tree *node;
	node=(tree*)malloc(sizeof(tree));
	printf("请输入节点为%d的左儿子",bt->data);
	scanf("%d",&n);
	if(n!=0){
		node->data=n;
		node->l=0;
		node->r=0;
		bt->l=node;
		creat(bt->l);
	}
	printf("请输入节点为%d的右儿子",bt->data);
	scanf("%d",&n);
	if(n!=0){
		node->data=n;
		node->l=0;
		node->r=0;
		bt->r=node;
		creat(bt->r);
	}
} 
print(tree *bt){
	tree **q;
	tree*p;
    q=(tree**)malloc(size*sizeof(tree*));
    int front=0,rear=0;
    rear=(rear+1)%size;
    q[rear]=bt;
    while(front!=rear){
    	front=(front+1)%size;
    	p=q[front];
    	printf("%d ",p->data);
    	if(p->l){
    		rear=(rear+1)%size;
    		q[rear]=p->l;
		}
		if(p->r){
			rear=(rear+1)%size;
			q[rear]=p->r;
		}
	}
	free(q);
}
tree* insert(int m,tree *bt){
	if(!bt){
     bt=(tree*)malloc(sizeof(tree));
     bt->data=m;
     bt->l=0;
     bt->r=0;
	}
	else {
		if(m>bt->data){
		bt->r=insert(m,bt->r);
	}
	 if(m<bt->data){
		bt->l=insert(m,bt->l);
	}
   }
	return bt;
}
tree* findmin(tree *bt)
{
	if(bt->l){
		findmin(bt->l);
	}
	else{
		return bt;
	}
}
tree* delet(int k,tree *bt){
	tree *tem;
	tem=(tree*)malloc(sizeof(tree));
		if(!bt){
			printf("未找到%d",k);
		}
		 else if(k<bt->data){
		   bt->l=delet(k,bt->l);
		}
		else if(k>bt->data){
			bt->r=delet(k,bt->r);
		}
		else 
		    if(bt->l&&bt->r){
		    	tem=findmin(bt->r);
		    	bt->data=tem->data;
		    	bt->r=delet(bt->data,bt->r);
			}
			else{
				tem=bt;
				if(!bt->l){
					bt=bt->r;
				}
				else if(!bt->r){
					bt=bt->l;
				}
				free(tem);
			}
			return bt;
}
main()
{
	tree *bt;
	bt=isno();
	creat(bt);
	print(bt);
	system("pause");
	system("cls");
	printf("请输入需要插入树中的数");
	int m;
	scanf("%d",&m);
	insert(m,bt); 
	print(bt);
	system("pause");
	system("cls");
	printf("请输入需要删除的数");
	int k;
	scanf("%d",&k);
	delet(k,bt);
	print(bt); 
}

1.二叉搜索树操作有创造根节点,创造其他节点,遍历,插入节点,删除节点,输出二叉树等(上述带码只有层序输出,先序后序中序输出请看本弱弱另一篇关于二叉树的文章
https://mp.youkuaiyun.com/mdeditor/89646812#
2.注意输入时应该以二叉排序树的规则输入(它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值),,否则函数功能不能实现呦。
3.本人感觉删除是这里最难的,介绍下删除,只有叶节点时直接删除就好,记得删除后父节点置为0呦,只有左儿子或右儿子时将指向自己的指针指向左儿子或右儿子即可。
3.当左右儿子都存在时我们将它转化为只有左儿子或只有右儿子的节点来处理,在他的右枝中照最小值来代替他(右枝的最小值一定只有右儿子或没有儿子),然后删除他的这个右枝中最小儿子就ok(有点绕,还是看代码理解理解吧 QAQ)

4… 加油努力鸭!QAQ “ ---- “
如果不懂,推荐看本弱弱另外两篇
二叉排序树2,https://blog.youkuaiyun.com/weixin_44836745/article/details/89646812
二叉排序树1,https://blog.youkuaiyun.com/weixin_44836745/article/details/89609462
发现错误,疑惑不解,联系作者:1939096278@qq.com
欢迎联系呦 -------- QAQ ---------;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值