问题 B: 二叉搜索树

题目描述
判断两序列是否为同一二叉搜索树序列

输入
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

输出
如果序列相同则输出YES,否则输出NO

样例输入 Copy
6
45021
12045
54120
45021
45012
21054
50412
0
样例输出 Copy
NO
NO
YES
NO
NO
NO

#include 
#include
using namespace std;
int flag;
struct node
{
    int data;
    struct node *l;
    struct node *r;
};
struct node *creat(int n, struct node *root)
{
    if(root==NULL)
    {
        root=(struct node*)malloc(sizeof(struct node));
        root->data=n;
        root->l=NULL;
        root->r=NULL;
    }
    else
    {
        if(n<root->data)
            root->l=creat(n,root->l);
        else root->r=creat(n,root->r);
    }
    return root;
};
void compare(struct node *root1,struct node *root2)
{
    if(root1!=NULL&&root2!=NULL)
    {
        if(root1->data!=root2->data)
        {
            flag=0;
            return;
        }
        else
        {
            compare(root1->l,root2->l);
            compare(root1->r,root2->r);
        }
    }
    else if((root1==NULL&&root2!=NULL)||(root1!=NULL&&root2==NULL))
    {
        flag=0;
        return;
    }
}
int main()
{
    int n,i,j,l;
    struct node *root1,*root2;
    while(scanf("%d",&n)!=EOF&&n)
    {
        char a[11],b[11];
        scanf("%s",a);
        root1=NULL;
        l=strlen(a);
        for(i=0; i<l; i++)
        {
            root1=creat(a[i]-'0',root1);
        }
        for(i=0; i<n; i++)
        {
            root2=NULL;
            flag=1;
            scanf("%s",b);
            l=strlen(b);
            for(j=0; j<l; j++)
            {
                root2=creat(b[j]-'0',root2);
            }
            compare(root1,root2);
            if(flag==1)printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}


一开始这样写的怎么也没找出来错误,后来发现,一个小地方忽略了。。。

#include 
#include
using namespace std;
int flag;
struct node
{
    char data;
    struct node *l;
    struct node *r;
};
struct node *creat(int n, struct node *root)
{
    if(root==NULL)
    {
        root=(struct node*)malloc(sizeof(struct node));
        root->data=n+'0';//这里转化为char类型
        root->l=NULL;
        root->r=NULL;
    }
    else
    {
        if(n+'0'<root->data)//这里也需要转化!!!
            root->l=creat(n,root->l);
        else root->r=creat(n,root->r);
    }
    return root;
};
void compare(struct node *root1,struct node *root2)
{
    if(root1!=NULL&&root2!=NULL)
    {
        if(root1->data!=root2->data)
        {
            flag=0;
            return;
        }
        else
        {
            compare(root1->l,root2->l);
            compare(root1->r,root2->r);
        }
    }
    else if((root1==NULL&&root2!=NULL)||(root1!=NULL&&root2==NULL))
    {
        flag=0;
        return;
    }
}
int main()
{
    int n,i,j,l;
    struct node *root1,*root2;
    while(scanf("%d",&n)!=EOF&&n)
    {
        char a[11],b[11];
        scanf("%s",a);
        root1=NULL;
        l=strlen(a);
        for(i=0; i<l; i++)
        {
            root1=creat(a[i]-'0',root1);
        }
        for(i=0; i<n; i++)
        {
            root2=NULL;
            flag=1;
            scanf("%s",b);
            l=strlen(b);
            for(j=0; j<l; j++)
            {
                root2=creat(b[j]-'0',root2);
            }
            compare(root1,root2);
            if(flag==1)printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}

你可能感兴趣的:(codeup)