题目1009:二叉搜索树

题目1009:二叉搜索树

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:9363

解决:4116

题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:

如果序列相同则输出YES,否则输出NO

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
来源:

2010年浙江大学计算机及软件工程研究生机试真题

这道题的关键在于:得是前序和中序都相同才能判断为同一个二叉树。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Node{
	Node *rchild;
	Node *lchild;
	int data;
};
Node *insert(Node *bt,int x)
{
	if(bt==NULL)
	{
		bt= new Node;
		bt->data=x;
		bt->lchild=bt->rchild=NULL;
	}
	else if(x<bt->data)
	{
		bt->lchild=insert(bt->lchild,x);
	}else if(x>bt->data)
	{
		bt->rchild=insert(bt->rchild,x);
	}
	return bt;
}
char ans1[10],ans2[10],ans3[10],ans4[10];
int cnt;
void preorder(Node *bt,char ans1[])
{
	ans1[cnt++]=bt->data;
	if(bt->lchild!=NULL)
		preorder(bt->lchild,ans1);
	if(bt->rchild!=NULL)
		preorder(bt->rchild,ans1);
}
void inorder(Node *bt,char ans1[])
{
	if(bt->lchild!=NULL)
		preorder(bt->lchild,ans1);
    ans1[cnt++]=bt->data;
	if(bt->rchild!=NULL)
		preorder(bt->rchild,ans1);
}

int main()
{
	char str1[10],str2[10];
	int n;
	while(scanf("%d",&n)!=EOF){
		if(n==0)break;
		scanf("%s",str1);
		int len1=strlen(str1);
		Node *bt=NULL;
		for(int i=0;i<len1;i++)
		{
			bt=insert(bt,str1[i]-'0');
		}
		cnt=0;
		preorder(bt,ans1);
		inorder(bt,ans2);
		while(n--){
			memset(ans2,0,sizeof(ans2));
			memset(str2,0,sizeof(str2));
			scanf("%s",str2);
			int len2=strlen(str2);
			Node *pt=NULL;
			for(int i=0;i<len1;i++)
			{
				pt=insert(pt,str2[i]-'0');
			}
			cnt=0;
			preorder(pt,ans3);
			inorder(pt,ans4);
			if(strcmp(ans1,ans3)==0&&strcmp(ans2,ans4)==0)
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
}


			


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值