二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和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 //建一颗树,判别其他序列是否与其一致 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 6 typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ 7 8 typedef struct TreeNode *Tree; 9 struct TreeNode 10 { 11 ElemType data; 12 Tree left,right; 13 int flag; //被访问过为1 否则0 14 }; 15 16 Tree NewNode(ElemType data); 17 Tree Insert(Tree T,ElemType data); 18 Tree MakeTree(int N); 19 bool check (Tree T,ElemType data); 20 int Judge(Tree T,int N); 21 void ResetT(Tree T); 22 void FreeTree(Tree T); 23 24 Tree NewNode(ElemType data) 25 { 26 Tree T = (Tree)malloc(sizeof(struct TreeNode)); 27 T->data = data; 28 T->left = T->right = NULL; 29 T->flag = 0; 30 return T; 31 } 32 33 Tree Insert(Tree T,ElemType data) 34 { 35 if( !T ) 36 T = NewNode(data); 37 else { 38 if(data > T->data) 39 T->right = Insert(T->right, data); 40 else 41 T->left = Insert(T->left, data); 42 } 43 return T; 44 } 45 46 Tree MakeTree(int N) 47 { 48 Tree T; 49 ElemType data; 50 scanf("%d",&data); 51 T = NewNode(data); 52 for(int i = 1; i < N; i++) { 53 scanf("%d",&data); 54 T = Insert(T,data); 55 } 56 return T; 57 } 58 59 bool check (Tree T,ElemType data) 60 { 61 if(T->flag) { 62 if(data < T->data) 63 return check(T->left,data); 64 else if(data > T->data) 65 return check(T->right,data); 66 }else { 67 if(data == T->data) { //是要找的结点 68 T->flag = 1; 69 return true; 70 } 71 else return false; //不是 不一致 72 } 73 } 74 75 int Judge(Tree T,int N) 76 { 77 ElemType data; 78 int flag = 0;//0代表目前仍一致 1代表已经不一致 79 scanf("%d",&data); 80 if(data != T->data) // 判断根节点是否一致 81 flag = 1; 82 else T->flag = 1; 83 for(int i = 1; i < N; i++) { //确保L读完 84 scanf("%d",&data); 85 if( (!flag) && (!check(T,data)) ) //不一致 86 flag = 1; 87 } 88 if(flag) //不一致 89 return 0; 90 else return 1; 91 } 92 93 void ResetT(Tree T)//清除T中各结点的flag标记 94 { 95 if(T->left) 96 ResetT(T->left); 97 if(T->right) 98 ResetT(T->right); 99 T->flag = 0; 100 } 101 102 void FreeTree(Tree T) //释放T的空间 103 { 104 if(T->left) 105 FreeTree(T->left); 106 if(T->right) 107 FreeTree(T->right); 108 free(T); 109 } 110 111 int main() 112 { 113 int N, L; 114 Tree T; 115 scanf("%d",&N); 116 while(N) { 117 scanf("%d",&L); 118 T = MakeTree(N); 119 for(int i = 0; i < L; i++) { 120 if(Judge(T, N)) 121 printf("Yes\n"); 122 else 123 printf("No\n"); 124 ResetT(T); //清除T中的标记flag 125 } 126 FreeTree(T); 127 scanf("%d",&N); 128 } 129 130 return 0; 131 }