zoukankan      html  css  js  c++  java
  • hdu 1001 二叉树搜索

    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

    题解:二叉树存储,不知道怎么优化一下代码。 另:不能单纯只比序列顺序
    #include <iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    struct node
    {
        int left,right,num;
    }tree[15],tree2[15];
    int n,len;
    char ch[15];
    void buildtree()
    {
        int i,k,j,l;
            for(i=1;i<=10;i++)
                {
                    tree[i].num=0;
                    tree[i].left=-1;
                    tree[i].right=-1;
                }
            l=1;
            tree[1].num=ch[0]-'0';
            for(i=1;i<len;i++)
            {
               k=ch[i]-'0';
               j=1;
               while(1)
               {
                  if (k>tree[j].num)
                  {
                       while(k>tree[j].num && tree[j].right!=-1)
                         j=tree[j].right;
                       if (tree[j].right==-1 && k>tree[j].num)
                       {
                            tree[++l].num=k;
                            tree[j].right=l;
                            break;
                       }
                  }
                  if (k<tree[j].num)
                  {
                       while(k<tree[j].num && tree[j].left!=-1)
                         j=tree[j].left;
                       if (tree[j].left==-1 && k<tree[j].num)
                       {
                           tree[++l].num=k;
                           tree[j].left=l;
                           break;
                       }
                  }
               }
            }
      return;
    }
    void buildtree2()
    {
        int i,j,k,l;
        for(i=1;i<=10;i++)
        {
            tree2[i].num=0;
            tree2[i].left=-1;
            tree2[i].right=-1;
        }
            l=1;
            tree2[1].num=ch[0]-'0';
            for(i=1;i<len;i++)
            {
               k=ch[i]-'0';
               j=1;
               while(1)
               {
                   if(k>tree2[j].num)
                   {
                       while(k>tree2[j].num && tree2[j].right!=-1)
                         j=tree2[j].right;
                       if (tree2[j].right==-1 && k>tree2[j].num)
                       {
                            tree2[++l].num=k;
                            tree2[j].right=l;
                            break;
                       }
                   }
                   if(k<tree2[j].num)
                   {
                       while(k<tree2[j].num && tree2[j].left!=-1)
                         j=tree2[j].left;
                       if (tree2[j].left==-1 && k<tree2[j].num)
                       {
                           tree2[++l].num=k;
                           tree2[j].left=l;
                           break;
                       }
                   }
               }
            }
        return;
    }
    int compare(int i,int j)
    {
        if(i==-1 && j==-1) return 1;
        if(i*j<0) return 0;
        if (tree[i].num==tree2[j].num)
        {
            if(!compare(tree[i].right,tree2[j].right)) return 0;
            if(!compare(tree[i].left,tree2[j].left)) return 0;
            return 1;
        } else return 0;
    }
    int main()
    {
        while(scanf("%d",&n),n!=0)
        {
            scanf("%s",&ch);
            len=strlen(ch);
            buildtree();
            for(;n>0;n--)
            {
                scanf("%s",&ch);
                buildtree2();
                if (compare(1,1)) printf("YES\n");
                            else printf("NO\n");
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    第五周笔记
    第四周笔记——复制文件(可读时间)
    第三周笔记
    java第6次作业
    java第五次作业
    java第四次作业
    java第三次作业
    第一周Java笔记
    计划进度表
    第六次作业
  • 原文地址:https://www.cnblogs.com/stepping/p/5491146.html
Copyright © 2011-2022 走看看