hdu 3791 二叉搜索树

二叉搜索树

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


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
 

 

Source

 

Recommend
notonlysuccess
 
 
  1 /**

  2 2

  3 567432

  4 543267

  5 576342

  6 

  7 **/

  8 

  9 #include<iostream>

 10 #include<stdio.h>

 11 #include<cstring>

 12 #include<cstdlib>

 13 using namespace std;

 14 

 15 struct node

 16 {

 17     int rp;

 18     struct node *lchild;

 19     struct node *rchild;

 20 };

 21 struct node *root;

 22 int len=0;

 23 

 24 void mem(struct node *p)

 25 {

 26     p->rp=0;

 27     p->lchild=NULL;

 28     p->rchild=NULL;

 29 }

 30 void insert_ecs(struct node **p,int x)

 31 {

 32     if( (*p) == NULL)

 33     {

 34         (*p)=(struct node*)malloc(sizeof(struct node));

 35         mem(*p);

 36         (*p)->rp=x;

 37         return;

 38     }

 39     if( (*p)->rp>x)

 40         insert_ecs(&(*p)->lchild,x);

 41     else

 42         insert_ecs(&(*p)->rchild,x);

 43 }

 44 

 45 void serch1(struct node *p,int *a)

 46 {

 47     a[++len]=p->rp;

 48     if(p->lchild!=NULL)

 49     serch1(p->lchild,a);

 50     if(p->rchild!=NULL)

 51     serch1(p->rchild,a);

 52 }

 53 void serch2(struct node *p,int *a)

 54 {

 55     if(p->lchild!=NULL)

 56     serch1(p->lchild,a);

 57     a[++len]=p->rp;

 58     if(p->rchild!=NULL)

 59     serch1(p->rchild,a);

 60 }

 61 void delete_ecs(struct node *p)

 62 {

 63      if(p->lchild!=NULL)

 64     delete_ecs(p->lchild);

 65     if(p->rchild!=NULL)

 66    delete_ecs(p->rchild);

 67     free(p);

 68 }

 69 void cs(int *a,int *b,int n)

 70 {

 71     int i;

 72     for(i=1;i<=n;i++)

 73         printf("%d ",a[i]);

 74     printf("\n");

 75     for(i=1;i<=n;i++)

 76         printf("%d ",b[i]);

 77     printf("\n");

 78 }

 79 int  main()

 80 {

 81     int n,i,j,k1,k2;

 82     char c[20];

 83     int s1[20],s2[20],s3[20];

 84     while(scanf("%d",&n)>0)

 85     {

 86         if(n==0)break;

 87         scanf("%s",c);

 88         k1=strlen(c);

 89         root=NULL;

 90         for(i=0;i<k1;i++)

 91         {

 92             insert_ecs(&root,c[i]-'0');

 93         }

 94         len=0;

 95         serch1(root,s1);

 96         len=0;

 97         serch2(root,s2);

 98        while(n--)

 99         {

100             scanf("%s",c);

101             k2=strlen(c);

102             if(k2!=k1){ printf("NO\n"); continue;}

103 

104             struct node *head=NULL;

105             for(j=0;j<k2;j++)

106                 insert_ecs(&head,c[j]-'0');

107             len=0;

108             serch1(head,s3);

109             for(j=1;j<=k1;j++)

110                 if(s1[j]!=s3[j])break;

111             if(j<=k1)

112             {

113                 printf("NO\n");

114                 delete_ecs(head);

115                 continue;

116             }

117             len=0;

118             serch2(head,s3);

119 

120             for(j=1;j<=k2;j++)

121             if(s2[ j ] !=s3[ j ])break;

122             if(j<=k2)

123             {

124                 delete_ecs(head);

125                 printf("NO\n");

126                 continue;

127             }

128             printf("YES\n");

129         }

130         delete_ecs(root);

131     }

132     return 0;

133 }

 

你可能感兴趣的:(HDU)