Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
题解:二叉树存储,不知道怎么优化一下代码。 另:不能单纯只比序列顺序
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int left,right,num;
}tree[15],tree2[15];
int n,len;
char ch[15];
void buildtree()
{
int i,k,j,l;
for(i=1;i<=10;i++)
{
tree[i].num=0;
tree[i].left=-1;
tree[i].right=-1;
}
l=1;
tree[1].num=ch[0]-'0';
for(i=1;i<len;i++)
{
k=ch[i]-'0';
j=1;
while(1)
{
if (k>tree[j].num)
{
while(k>tree[j].num && tree[j].right!=-1)
j=tree[j].right;
if (tree[j].right==-1 && k>tree[j].num)
{
tree[++l].num=k;
tree[j].right=l;
break;
}
}
if (k<tree[j].num)
{
while(k<tree[j].num && tree[j].left!=-1)
j=tree[j].left;
if (tree[j].left==-1 && k<tree[j].num)
{
tree[++l].num=k;
tree[j].left=l;
break;
}
}
}
}
return;
}
void buildtree2()
{
int i,j,k,l;
for(i=1;i<=10;i++)
{
tree2[i].num=0;
tree2[i].left=-1;
tree2[i].right=-1;
}
l=1;
tree2[1].num=ch[0]-'0';
for(i=1;i<len;i++)
{
k=ch[i]-'0';
j=1;
while(1)
{
if(k>tree2[j].num)
{
while(k>tree2[j].num && tree2[j].right!=-1)
j=tree2[j].right;
if (tree2[j].right==-1 && k>tree2[j].num)
{
tree2[++l].num=k;
tree2[j].right=l;
break;
}
}
if(k<tree2[j].num)
{
while(k<tree2[j].num && tree2[j].left!=-1)
j=tree2[j].left;
if (tree2[j].left==-1 && k<tree2[j].num)
{
tree2[++l].num=k;
tree2[j].left=l;
break;
}
}
}
}
return;
}
int compare(int i,int j)
{
if(i==-1 && j==-1) return 1;
if(i*j<0) return 0;
if (tree[i].num==tree2[j].num)
{
if(!compare(tree[i].right,tree2[j].right)) return 0;
if(!compare(tree[i].left,tree2[j].left)) return 0;
return 1;
} else return 0;
}
int main()
{
while(scanf("%d",&n),n!=0)
{
scanf("%s",&ch);
len=strlen(ch);
buildtree();
for(;n>0;n--)
{
scanf("%s",&ch);
buildtree2();
if (compare(1,1)) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}