九度OJ 教程36 排序二叉树的建立与比较是否相同。

题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=35


//九度OJ 教程36 排序二叉树的建立与比较是否相同。
//http://ac.jobdu.com/problem.php?cid=1040&pid=35
#include <stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct tt{
	char data;
	struct tt *l,*r;
}tt,*tp;
int flag;//全局变量,标记排序树是否相等。
void tfree(tt *root)
{
	if(root==NULL)return;
	tfree(root->l);
	tfree(root->r);
	free(root);
}
int comp(tt *root,tt *root1)
{
	if(root==NULL&&root1==NULL)return 1;
	if(root==NULL||root1==NULL)return 0;//由于上个语句有return 1,则这个如果成立的话便是有且只有一个为NULL。
	if(root->data!=root1->data)return 0;
	return ((comp(root->l,root1->l))&&(comp(root->r,root1->r)));
}
int main()
{
	int n;
	tp root=NULL,root1=NULL;
	tp p=NULL,q2=NULL,q1=NULL;
	int i,j,k,l;
	char hh[10];
	while(~scanf("%d",&n)&&n)
	{
		root=(tt *)malloc(sizeof(tt));
		scanf("%s",hh);
		l=strlen(hh);
		root->l=root->r=NULL;
		root->data=hh[0];
		for(i=1;i<l;i++)
		{
			q1=NULL;
			q2=root;
			p=(tt *)malloc(sizeof(tt));
			p->l=p->r=NULL;
			p->data=hh[i];
			while(q2!=NULL)
			{
				if(p->data>q2->data)
				{
					q1=q2;
					q2=q2->r;
				}
				else
				{
					q1=q2;
					q2=q2->l;
				}
			}
			if(p->data>q1->data){q1->r=p;}
			else q1->l=p;
		}
		for(j=0;j<n;j++)
		{
			root1=(tt *)malloc(sizeof(tt));
			scanf("%s",hh);
			l=strlen(hh);
			root1->l=root1->r=NULL;
			root1->data=hh[0];
			for(i=1;i<l;i++)
			{
				q1=NULL;
				q2=root1;
				p=(tt *)malloc(sizeof(tt));
				p->l=p->r=NULL;
				p->data=hh[i];
				while(q2!=NULL)
				{
					if(p->data>q2->data)
					{
						q1=q2;
						q2=q2->r;
					}
					else
					{
						q1=q2;
						q2=q2->l;
					}
				}
				if(p->data>q1->data){q1->r=p;}
				else q1->l=p;
			}
			flag=comp(root,root1);
			if(flag)printf("YES\n");
			else printf("NO\n");
			tfree(root1);
		}
		tfree(root);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值