04-树4 是否同一棵二叉搜索树 (25 分)

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。

简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

输出样例:

Yes
No
No

鸣谢青岛大学周强老师补充测试数据!

  1 #include <cstdio>
  2 #include <stdlib.h>
  3 typedef struct TreeNode* Tree;
  4 struct TreeNode {
  5     int v;
  6     Tree left, right;
  7     int flag;
  8 };
  9 Tree build(int n) ;
 10 
 11 bool judge(Tree head, int n);
 12 void resetT(Tree head);
 13 Tree insert(Tree T, int data);
 14 int check(Tree t, int v);
 15 int main() {
 16     int n, l;
 17     Tree ref;
 18     
 19     scanf("%d", &n);
 20     while(n) {
 21         scanf("%d", &l);
 22 
 23         ref = build(n);
 24         for(int i=0; i<l; i++) {
 25             if(judge(ref, n)) printf("Yes\n");
 26             else printf("No\n");
 27             resetT(ref);
 28         }
 29         //FreeTree(ref);
 30         scanf("%d", &n);
 31     }
 32     
 33 }
 34 
 35 Tree build(int n){
 36     Tree T = NULL;
 37     int data;
 38     
 39     for(int i=0; i<n; i++) {
 40         scanf("%d", &data);
 41         T = insert(T, data);
 42     }
 43     
 44     return T;
 45 }
 46 Tree insert(Tree T, int data) {
 47     if(!T) {
 48         T = (Tree) malloc(sizeof(struct TreeNode));
 49         T->v = data;
 50         T->left = T->right = NULL;
 51         T->flag = 0;
 52     }
 53     else if(data > T->v) T->right = insert(T->right, data);
 54     else if(data < T->v) T->left = insert(T->left, data);
 55     
 56     return T;
 57 }
 58 
 59 
 60 bool judge(Tree head, int n) {
 61     
 62     int v;
 63     int flag = 0;
 64     
 65     for(int i=0; i<n; i++) {
 66         scanf("%d", &v);
 67         if(check(head, v)) flag = 1;
 68     }
 69     
 70     if(flag == 1) return false;
 71     else return true;
 72     
 73 }
 74 //incoordinate - 1
 75 int check(Tree t, int v) {
 76     
 77     
 78     if(t->flag) {
 79         if(v > t->v) return check(t->right, v);
 80         else if(v < t->v) return check(t->left, v);
 81         else return 1;
 82     } 
 83     
 84     else {
 85         if(v == t->v) {
 86             t->flag = 1;
 87             return 0;
 88         }
 89         else return 1;
 90     }
 91     
 92     
 93 
 94     
 95 }
 96 void resetT(Tree T) {
 97     if(T->left) resetT(T->left);
 98     if(T->right) resetT(T->right);
 99     T->flag = 0;
100 }
101 
102 void FreeT(Tree T) {
103     if(T->left) FreeT(T->left);
104     if(T->right) FreeT(T->right);
105     free(T);
106 }

 

posted @ 2019-05-28 10:23  Acoccus  阅读(159)  评论(0编辑  收藏  举报