题意:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
知道了二叉搜索树的定义,这道题就很清楚了,很基础的建树和遍历,不多说了,上代码。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node //用链表存二叉树
{
struct node *lchild;
struct node *rchild;
int date;
};
void same(node *aa,node *bb);
int f;
node *build(char num[]) //建树
{
int i,k;
node *root,*s,*p,*q;
root=NULL;
for(i=0;num[i]!='\0';i++) //数组中元素全部循环
{
s=(struct node*)malloc(sizeof(node)); //分配一个新的结点
s->date=num[i]-'0';
s->lchild=NULL;
s->rchild=NULL;
p=root;<span style="white-space:pre"> </span>//从根节点开始寻找
q=p;
while(p!=NULL) //找到可以插入的位置
{
q=p;
if(p->date>s->date) //数据小于结点数据,向左寻找
{
p=p->lchild;
}
else
p=p->rchild; //否则,向右寻找
}
if(q==NULL) //如果为空,则为根节点
root=s;
else if(q->date>s->date) //数据小于结点数据,为该结点左儿子
q->lchild=s;
else //大于结点数据,为右儿子
q->rchild=s;
}
return root; //返回根节点
}
int main()
{
int i,j,k,m,n;
node *aa;
node *bb;
char num[100],num1[100];
while(scanf("%d",&n),n)
{
scanf("%s",num);
aa=build(num);
for(i=1;i<=n;i++)
{
f=0;
scanf("%s",num1);
if(strlen(num)!=strlen(num1))
printf("NO\n");
else
{
bb=build(num1);
f=1;
same(aa,bb);
if(f==1)
printf("YES\n");
else
printf("NO\n");
}
}
}
return 0;
}
void same(node *aa,node *bb) //递归,先序遍历
{
if(aa!=NULL&&bb!=NULL)
{
if(aa->date!=bb->date)
{
f=0;
return ;
}
else
{
same(aa->lchild,bb->lchild);
same(aa->rchild,bb->rchild);
}
}
else if(aa==NULL&&bb!=NULL)
{
f=0;
return ;
}
else if(aa!=NULL&&bb==NULL)
{
f=0;
return ;
}
}