补SDUT-2482

来源:互联网 发布:炫踪网络上市 编辑:程序博客网 时间:2024/05/22 13:11

  今天和贺老师讨论了一下这个题,有了新的收获;昨天发的代码不是正解,正解应该是先对给出两个序列进行建树,然后保存树的先序遍历结果,对比这两个先序遍历的结果是否一样;如果一样就是同一棵二叉树,否则不是。

  先概括一下这两个解法:第一个解法是对两个要比较的序列分别建树,然后保存下来两个树的先序遍历序列,并比较这两个先序遍历序列是否相等;若相等则是同一棵树,否则不是!第二种解法是只对第一个序列建树并对建好的树进行先序遍历,保存先序遍历的结果;将先序遍历的结果直接与第二个输入的序列比较,若相等则是同一棵树,否则不是!

第二种解法是错误的,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;}


  不断修正自己的错误是很重要的;不要一味的写题写题,我需要脚踏实地!