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 }