题目1009:二叉搜索树(C语言实现)

九度上的一个题如下:

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

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

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
我的代码(提交是选择C++编译器提交成的,无语):

#include<stdio.h>
#include<malloc.h>
#include<string.h>

typedef struct Node
{
	int data;
	Node * l,*r;
}Node;

void insert(Node * root,int data)
{
	if(!root) return;
	while(1)
	{
		if(root->data > data && root->l) root = root->l;
		else if(root->data < data && root->r) root = root->r;
		else if(root->data == data) return;
		else break;
	}
	if(root->data > data)
	{
		Node * newNode = (Node *)malloc(sizeof(Node));
		newNode->l = newNode->r = NULL;
		newNode->data = data;
		root->l = newNode;
	}else if(root->data < data)
	{
		Node * newNode = (Node *)malloc(sizeof(Node));
		newNode->l = newNode->r = NULL;
		newNode->data = data;
		root->r = newNode;
	}
	
}

int compareTree(Node * s,Node * t)
{	
	if(!s && !t) return 1;
	if(!s || !t) return 0;
	if(s->data != t->data) 
	{
		return 0;
	}
	if(compareTree(s->l,t->l) && compareTree(s->r,t->r)) return 1;
	return 0;
}

Node * createTree(Node * root,char s[])
{
	int len = strlen(s);
	for(int i = 1; i < len; i++)
	{
		insert(root,s[i]-'0');
	}
	return root;
}
//  这个方法在此程序没用,我写着玩的
void inOrder(Node * root)
{
	if(!root) return;
	else
	{
		inOrder(root->l);
		printf("%d",root->data);
		inOrder(root->r);
	}
}
int main()
{
	int n;
	char s1[11],s2[11];
	while(scanf("%d",&n)!=EOF && n)
	{
		scanf("%s",s1);
		Node * root1 = (Node *)malloc(sizeof(Node));
		root1->data = s1[0]-'0';
		root1->r = root1->l = NULL; 
		root1 = createTree(root1,s1);
		for(int i = 0;i < n; i++)
		{
			scanf("%s",s2);
			Node * root2 = (Node *)malloc(sizeof(Node));
			root2->l = root2->r = NULL;
			root2->data = s2[0]-'0';
			root2 = createTree(root2,s2);
			if(compareTree(root1,root2))
			{
				printf("%s\n","YES");
			}else
			{
				printf("%s\n","NO");
			}
		}		
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值