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

  

posted on 2016-05-13 21:19  Yxter  阅读(200)  评论(0编辑  收藏  举报

导航