5-7 是否同一棵二叉搜索树 (25分)

5-7 是否同一棵二叉搜索树   (25分)

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数NN (\le 1010)和LL,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出NN个以空格分隔的正整数,作为初始插入序列。最后LL行,每行给出NN个插入的元素,属于LL个需要检查的序列。

简单起见,我们保证每个插入序列都是1到NN的一个排列。当读到NN为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

输出样例:

Yes
No
No


哎哟,不错哦~好像数据加强了,然后把n的范围改大了??

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int BST_one[1000000];
int BST_two[1000000];
int n;

void Build_one(int num,int data)
{
    if(data>=BST_one[num])
    {
        if(BST_one[2*num+1]==-1)
            BST_one[2*num+1]=data;
        else
            Build_one(2*num+1,data);
    }
    else
    {
        if(BST_one[2*num]==-1)
            BST_one[2*num]=data;
        else
            Build_one(2*num,data);
    }
}

int Judge()
{
//    for(int i=1;i<=4*n;i++)
//        printf("%3d",BST_one[i]);
//    puts("");
//    for(int i=1;i<=4*n;i++)
//        printf("%3d",BST_two[i]);
//    puts("");
    for(int i=1; i<=4*n; i++)
        if(BST_one[i]!=BST_two[i])
            return 0;
    return 1;
}

void Build_two(int num,int data)
{
    if(data>=BST_two[num])
    {
        if(BST_two[2*num+1]==-1)
            BST_two[2*num+1]=data;
        else
            Build_two(2*num+1,data);
    }
    else
    {
        if(BST_two[2*num]==-1)
            BST_two[2*num]=data;
        else
            Build_two(2*num,data);
    }
}

int main()
{
    int L;
    while(scanf("%d",&n)&&n)
    {
        int x;
        scanf("%d",&L);

        memset(BST_one,-1,sizeof(BST_one));

        scanf("%d",&BST_one[1]);
        for(int i=2; i<=n; i++)
        {
            scanf("%d",&x);
            Build_one(1,x);
        }
        while(L--)
        {
            int flag=1;
            memset(BST_two,-1,sizeof(BST_two));

            scanf("%d",&BST_two[1]);
            for(int i=2; i<=n; i++)
            {
                scanf("%d",&x);
                Build_two(1,x);
            }
            if(!Judge())
                flag=0;
            if(flag)
                puts("Yes");
            else
                puts("No");
        }
    }
    return 0;
}





posted @ 2016-11-22 12:52  see_you_later  阅读(418)  评论(0编辑  收藏  举报