题目1009:二叉搜索树

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4483

解决:2008

题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:

如果序列相同则输出YES,否则输出NO

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
来源:
2010年浙江大学计算机及软件工程研究生机试真题
方法1:
  利用静态数组模拟二叉树
cpp代码:
#include<iostream>
using namespace std;

int a[1024];
int b[1024];
void createtree(string s,int c[])
{
    int len=s.length();
    for(int i=0;i<len;i++)
    {
        int temp=s[i]-'0';
        for(int j=1;j<=1023;)
        {
            if(c[j]==-1)
            {c[j]=temp;break;}
            else if(c[j]>temp)
            j=j*2;
            else
            j=j*2+1;    
        }
    }        
}

int main()
{
    int n,i;
    string s;
    string t;
    while(cin>>n&&n)
    {
        for(i=0;i<1024;i++) a[i]=-1;
        cin>>s;
        createtree(s,a);
        while(n--)
        {
            for(i=0;i<1024;i++) b[i]=-1;
            cin>>t;
            createtree(t,b);
            for(i=0;i<1024;i++) 
            if(a[i]!=b[i]) break;
            if(i==1024)
            cout<<"YES"<<endl;
            else
            cout<<"NO"<<endl;           
        }    
    }
    return 0;
}

方法2:

判断左右孩子是否相等

 1 #include <stdio.h> 
 2 #include <string.h>
 3 #include <stdlib.h>
 4 typedef struct BTNode
 5 {
 6     int data;
 7     struct BTNode *lchild;
 8     struct BTNode *rchlid;
 9     
10 }BTNode;
11 void myinsert(BTNode *&p,int tmp)
12 {
13     if(p==NULL)
14     {
15         p=new BTNode;
16         p->lchild=NULL;
17         p->rchlid=NULL;
18         p->data=tmp;
19     }
20     else if(p->data>tmp)
21         myinsert(p->lchild,tmp);
22     else if(p->data<tmp)
23         myinsert(p->rchlid,tmp);
24 }
25 void BTcreate(BTNode *&p,char *c,int l)
26 {
27     p=NULL;
28     int i;
29     int tmp;
30     for(i=0;i<l;i++)
31     {
32         tmp=c[i]-'0';
33         myinsert(p,tmp);
34     }
35     
36 }
37 int flag=1;
38 int BTsearch(BTNode *p1,BTNode *p2)
39 {
40     
41     if(p1==NULL&&p2==NULL)
42         return 1;
43     else if(p1!=NULL&&p2==NULL)
44         return 0;
45     else if(p2!=NULL&&p1==NULL)
46         return 0;
47     if(p1->data==p2->data)
48     {
49         flag=BTsearch(p1->lchild,p2->lchild);
50         if(flag==0)
51             return 0;
52         flag=BTsearch(p1->rchlid,p2->rchlid);
53         if(flag==0)
54             return 0;
55     }
56     else    
57         return 0;
58     return 1;
59         
60 }
61 void myfree(BTNode *p)
62 {
63     if(p!=NULL)
64     {
65         myfree(p->lchild);
66         myfree(p->rchlid);
67         free(p);
68     }
69 }
70 int main(void)
71 {
72     int n;
73     int len;
74     while(scanf("%d",&n)!=EOF&&n!=0)
75     {
76         char str[10];
77         BTNode *num;
78         getchar();
79         gets(str);
80         len=strlen(str);
81         BTcreate(num,str,len);
82         int i;
83         for(i=0;i<n;i++)
84         {
85             char str2[10];
86             gets(str2);
87             BTNode *num2;
88             BTcreate(num2,str2,len);
89             int result;
90             result=BTsearch(num,num2);
91             if(result==1)
92                 puts("YES");
93             else
94                 puts("NO");
95             myfree(num2);
96         }
97         myfree(num);
98     }
99 }

在天勤AC,在九度RE。好奇怪啊。

  

posted @ 2014-09-04 01:23  卡洛斯的拉幕人  阅读(168)  评论(0编辑  收藏  举报