2021/05/25 7-4 是否同一棵二叉搜索树 (25 分)

该博客讨论了如何判断不同的插入序列是否能生成相同的二叉搜索树。通过先序遍历比较两棵树的结构,若不同则输出No,相同则输出Yes。示例展示了对于不同输入序列的判断过程。

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

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。

简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

输出样例:

Yes
No
No

本题思路:创建出两个二叉搜索树,采用先序遍历进行两颗树的比较,有不同的直接输出No即可;

#include<stdio.h>
#include<stdlib.h>
int Flag;//全局变量flag  
typedef struct tree{
	int date;
	struct tree *left,*right;
}Bintree;
Bintree *insert(Bintree *bt,int x);//插入函数 
void printS(Bintree *t1,Bintree *t2);//先序遍历并且进行比较 
int main()
{
	int n,l,i,x;	
	while(scanf("%d",&n)&&n!=0)
	{
	    scanf("%d",&l);	
		Bintree *bt1;	
		bt1=NULL;
		for(i=0;i<n;i++)
		{
			scanf("%d",&x);	
			bt1=insert(bt1,x);
		}					
		while(l--)
		{
			Bintree *bt2;
            bt2=NULL;
              for(i=0;i<n;i++)
		    { 
			   scanf("%d",&x);
			   bt2=insert(bt2,x);
		    } 
            Flag=1;
		    printS(bt1,bt2);
		    (Flag)?printf("Yes\n"):printf("No\n");	                       
		}			
	}
	return 0;
}
Bintree *insert(Bintree *bt,int x)
{		
	if(bt==NULL)
	{
		bt=(Bintree*)malloc(sizeof(Bintree));
		bt->date=x;
		bt->left=NULL;
		bt->right=NULL;	
		return bt;			
	}
	if(bt!=NULL)
	{
		if(x<(bt->date))  //二叉搜索树的特性,比它小放它左边,反之放右边 
		bt->left=insert(bt->left,x);
		else
		bt->right=insert(bt->right,x);
	}
	return bt;
}
void printS(Bintree *t1,Bintree *t2)
{
	if(t1&&t2)
	{
		if(t1->date!=t2->date)//如果有出现不同 直接将全局变量变为0 
			Flag=0;
		else  //否则递归的遍历 
		{
		printS(t1->left,t2->left);
		printS(t1->right,t2->right);	
		}
	}
}

 

测试点提示结果分数耗时内存
0sample 换顺序。有Yes,有No:根不同,子树根不同。树有单边、有双子树

答案正确

124 ms184 KB
1最大N,多组合

答案正确

84 ms336 KB
2N=1,只有1个节点

答案正确

34 ms276 KB
3卡只判断数字相对先后位置的错误算法

答案正确

23 ms196 KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值