补SDUT-2482

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

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

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


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值