今天和贺老师讨论了一下这个题,有了新的收获;昨天发的代码不是正解,正解应该是先对给出两个序列进行建树,然后保存树的先序遍历结果,对比这两个先序遍历的结果是否一样;如果一样就是同一棵二叉树,否则不是。
先概括一下这两个解法:第一个解法是对两个要比较的序列分别建树,然后保存下来两个树的先序遍历序列,并比较这两个先序遍历序列是否相等;若相等则是同一棵树,否则不是!第二种解法是只对第一个序列建树并对建好的树进行先序遍历,保存先序遍历的结果;将先序遍历的结果直接与第二个输入的序列比较,若相等则是同一棵树,否则不是!
第二种解法是错误的,SDUTOJ的评测数据不完整!
补一些知识:二叉排序树的中序序列是递增的!而这道题目又说了序列数字都在零到九之间!也就是说如果两棵树的前序遍历序列相等的话,中序遍历序列必定相等!这是隐含的条件。我真的是太渣了!
代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}bstnode;
char sr[55],sq[55],sr2[55],sq2[55];
int sq0,sq1;
void jianshu(bstnode *&p,char ch)
{
if(p==NULL)
{
p=(bstnode *)malloc(sizeof(bstnode));
p->data=ch;
p->lchild=p->rchild=NULL;
}
else if(ch<p->data)
jianshu(p->lchild,ch);
else
jianshu(p->rchild,ch);
}
void pre0(bstnode *p)
{
if(p)
{
sq[sq0++]=p->data;
pre0(p->lchild);
pre0(p->rchild);
}
}
void pre1(bstnode *p)
{
if(p)
{
sq2[sq1++]=p->data;
pre1(p->lchild);
pre1(p->rchild);
}
}
int main()
{
int i,m;
while(cin>>m&&m!=0)
{
bstnode *tree=NULL;
cin>>sr;
int len1=strlen(sr);
for(i=0;i<len1;i++)
jianshu(tree,sr[i]);
sq0=0;
pre0(tree);
sq[sq0]='\0';///这个不加会错
while(m--)
{
bstnode *tree1=NULL;
cin>>sr2;
int len2=strlen(sr2);
for(i=0;i<len2;i++)
jianshu(tree1,sr2[i]);
sq1=0;
pre1(tree1);
sq2[sq1]='\0';
if(strcmp(sq,sq2)==0)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
不断修正自己的错误是很重要的;不要一味的写题写题,我需要脚踏实地!