二叉排序树
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树
输入
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)
输出
示例输入
2 123456789 987654321 432156789 0
示例输出
NONO
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char a[100], b[100];
char I1[100], P1[100], I2[100], P2[100];
int N;
struct node
{
char data;
node *lch,*rch;
};
void creat(node *&t,char n)
{
if(t){
if(n<t->data)creat(t->lch,n);
else
creat(t->rch,n);
}
else
{
t=new node ;
t->data=n;
t->lch=NULL;
t->rch=NULL;
}
}
void inorder(node *&t,char I[])
{
if(t)
{
inorder(t->lch,I);
I[N++]=t->data;
inorder(t->rch,I);
}
}
void posorder(node *&t,char P[])
{
if(t)
{
posorder(t->lch,P);
posorder(t->rch,P);
P[N++]=t->data;
}
}
int main()
{
int n,t;
while(scanf("%d",&n),n)
{ memset(a,0,sizeof(a));
scanf("%s",a);
t=strlen(a);
int i;
node *t1;
t1=NULL;
for(i=0;i<t;i++)
{
creat(t1,a[i]);
}
N=0;
inorder(t1,I1);
I1[N]='\0';
N=0;
posorder(t1,P1);
P1[N]='\0';
while(n--)
{ memset(b,0,sizeof(b));
scanf("%s",b);
t=strlen(b);
if(strlen(a)!=strlen(b))printf("NO\n");
else
{
node *t2;
t2=NULL;
for(i=0;i<t;i++)
{
creat(t2,b[i]);
}
N=0;
inorder(t2,I2);
I2[N]='\0';
N=0;
posorder(t2,P2);
P2[N]='\0';
if(strcmp(I1,I2)||strcmp(P1,P2))printf("NO\n");
else
printf("YES\n");
}
}
}
return 0;
}