• 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;
    }
    
    




  • 相关阅读:
    2014.7建兰NOIP模拟Day1 Running
    简单的数论函数模板
    二分图匹配的匈牙利算法
    手算平方根
    ...
    hdu 5396 Expression(区间DP+组合数)
    hdu 5693 D Game(区间DP)
    hdu 5151 Sit sit sit(区间dp+排列组合)
    hdu 4570 Multi-bit Trie(dp)
    hdu 2855 Fibonacci Check-up (矩阵)
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777525.html
Copyright © 2020-2023  润新知