zoukankan      html  css  js  c++  java
  • HDU 3791 判断是否是同一二叉树

    二叉搜索树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 8507    Accepted Submission(s): 3814


    Problem Description
    判断两序列是否为同一二叉搜索树序列
     
    Input
    开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
    接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
    接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
     
    Output
    如果序列相同则输出YES,否则输出NO
     
    Sample Input
    2
    567432
    543267
    576342
    0
     
    Sample Output
    YES
    NO
     
    题意:开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
    接下去一行是一个母序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
    接下去的n行有n个子序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成一颗相同的二叉搜索树。
     
    #include<iostream>
    #include<string.h>
    #include<string>
    #include<algorithm>
    #include<math.h>
    #include<string>
    #include<string.h>
    #include<vector>
    #include<utility>
    #include<map>
    #include<queue>
    #include<set>
    #define mx 0x3f3f3f3f
    #define ll long long
    #define MAXN 100
    using namespace std;
    int tree[10005],a[10005];
    int tree1[10005];
    
    void insert()//二叉树建树
    {
        memset(tree,-1,sizeof(tree));
        for(int i=0;a[i];i++)
        {
            int num=a[i]-'0';
            int j=1;
            while(tree[j]!=-1)
            {
                if(num>tree[j])
                    j=j*2;
                else
                    j=j*2+1;
            }
            tree[j]=num;
        }
    
    }
    int main()
    {
        int n;
        while(cin>>n){
        if(n==0)
            break;
        string s;
        cin>>s;
        memset(tree,-1,sizeof(tree));
        for(int i=0;s[i];i++)
        {
            int num=s[i]-'0';
            int j=1;
            while(tree[j]!=-1)
            {
                if(num<tree[j])
                    j=j*2;
                else
                    j=j*2+1;
            }
            tree[j]=num;
        }
        
        while(n--)
        {
            string ss;
            cin>>ss;
            memset(tree1,-1,sizeof(tree1));
            for(int i=0;ss[i];i++)
            {
                int num=ss[i]-'0';
                int j=1;
                while(tree1[j]!=-1)
                {
                    if(num<tree1[j])
                        j=j*2;
                    else
                        j=j*2+1;
                }
                tree1[j]=num;
            }
            int i;
            for(i=1;i<=1024&&tree[i]==tree1[i];i++);
            if(i>1024)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
            
        }
    }
        return 0;
    
    }
  • 相关阅读:
    文件操作小练习
    阶段练习1
    copy小练习
    小练习
    str 小列题
    条款50:使用自定义的new以及delete的时机会
    条款49:了解new-handle行为
    简单的说一下:tarits技法就是一种模板元编程,起可以将本来处于运行期的事拉到编译期来做,增加了运行效率。 看以非模板元编程的例子,就是前面的那个例子:
    条款47:请使用traits class表示类型信息
    条款46:需要类型转换的时候请为模板定义非成员函数
  • 原文地址:https://www.cnblogs.com/-citywall123/p/11436554.html
Copyright © 2011-2022 走看看