PTA数据结构与算法题目集(中文) 7-4 是否同一颗二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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
题目分析: 将元素插入到二叉搜索树中 然后对2个树是否一致进行递归的比较 具体想法类似于7-3 也是递归调用比较函数进行判别

1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 6 typedef struct TNode* LChild; 7 typedef struct TNode* RChild; 8 typedef struct TNode* Tree; 9 typedef int ElementType; 10 11 struct TNode 12 { 13 ElementType Data; 14 LChild Lc; 15 RChild Rc; 16 }; 17 Tree A; 18 Tree B; 19 Tree Insert(ElementType Element, Tree T) 20 { 21 if (!T) 22 { 23 T = (Tree)malloc(sizeof(struct TNode)); 24 T->Data = Element; 25 T->Lc = NULL; 26 T->Rc = NULL; 27 } 28 else if (Element < T->Data) 29 T->Lc = Insert(Element, T->Lc); 30 else if (Element > T->Data) 31 T->Rc = Insert(Element, T->Rc); 32 return T; 33 } 34 35 Tree BuildSearchTree(int N,Tree T) 36 { 37 int num; 38 scanf("%d", &num); 39 T= Insert(num, T); 40 for (int i = 1; i < N; i++) 41 { 42 scanf("%d", &num); 43 Insert(num, T); 44 } 45 return T; 46 } 47 int Judge(Tree T1, Tree T2) 48 { 49 if (T1 == NULL && T2 == NULL) 50 return 1; 51 else if ((T1 == NULL && T2 != NULL)|| (T1 != NULL && T2 == NULL)) 52 return 0; 53 if (T1->Data == T2->Data) 54 { 55 if (Judge(T1->Lc, T2->Lc) && Judge(T1->Rc, T2->Rc)) 56 return 1; 57 else 58 return 0; 59 } 60 else 61 return 0; 62 } 63 void Free(Tree B) 64 { 65 if (B ==NULL) 66 return; 67 if (B->Lc == NULL && B->Rc == NULL) 68 free(B); 69 else 70 { 71 if (B->Lc != NULL) 72 { 73 Free(B->Lc); 74 B->Lc = NULL; 75 } 76 if (B->Rc != NULL) 77 { 78 Free(B->Rc); 79 B->Rc = NULL; 80 } 81 Free(B); 82 } 83 84 } 85 int main() 86 { 87 int N; 88 scanf("%d", &N); 89 while (N) 90 { 91 int L; 92 scanf("%d", &L); 93 A=BuildSearchTree(N, A); 94 for (int i = 0; i < L; i++) 95 { 96 B=BuildSearchTree(N, B); 97 if (Judge(A, B)) 98 printf("Yes "); 99 else 100 printf("No "); 101 Free(B); 102 B = NULL; 103 } 104 Free(A); 105 A = NULL; 106 scanf("%d", &N); 107 } 108 return 0; 109 }