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

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 
  5 typedef struct TreeNode *BinTree;
  6 struct TreeNode {
  7     int Data;
  8     BinTree Left;
  9     BinTree Right;
 10     int Flag;
 11 };  
 12 
 13 BinTree Insert(int X, BinTree BST)
 14 {
 15     if(!BST) {
 16         BST = (BinTree)malloc(sizeof(struct TreeNode));
 17         BST->Data = X;
 18         BST->Left = BST->Right = NULL;
 19         BST->Flag = 0;
 20     } else {
 21         if(X < BST->Data)
 22             BST->Left = Insert(X, BST->Left);
 23         else if(X > BST->Data)
 24             BST->Right = Insert(X, BST->Right);
 25     }
 26     return BST;
 27 }
 28 
 29 BinTree MakeTree(int num)
 30 {
 31     BinTree S = NULL;
 32     int i, data;
 33     for(i=0;i<num;i++) {
 34         scanf("%d", &data);
 35         S = Insert(data, S);
 36     }
 37     return S;
 38 }
 39 
 40 void ResetT(BinTree S)
 41 {
 42     if(S->Left) ResetT(S->Left);
 43     if(S->Right) ResetT(S->Right);
 44     S->Flag = 0;
 45 }
 46 
 47 void FreeTree(BinTree S)
 48 {
 49     if(S->Left) FreeTree(S->Left);
 50     if(S->Right) FreeTree(S->Right);
 51     free(S);
 52 }
 53 
 54 void InOrderTraversal(BinTree BT)
 55 {
 56     if(BT) {
 57         InOrderTraversal(BT->Left);
 58         printf("%d ", BT->Data);
 59         InOrderTraversal(BT->Right);
 60     }
 61 }
 62 
 63 int Check(BinTree T, int data)
 64 {
 65     if(T->Flag) {
 66         if(data < T->Data) 
 67             return Check(T->Left, data);
 68         else if(data > T->Data)
 69             return Check(T->Right, data);
 70         else
 71             return 0;                   /* 错误? */
 72     } else {
 73         if(data == T->Data) {
 74             T->Flag = 1;
 75             return 1;
 76         } else
 77             return 0;
 78     }
 79 }
 80 
 81 int Judge(BinTree T, int N)
 82 {
 83     int i, data, flag = 0;
 84     scanf("%d", &data);
 85     if(data != T->Data)
 86         flag = 1;
 87     else
 88         T->Flag = 1;
 89 
 90     for(i=1;i<N;i++) {
 91         scanf("%d", &data);
 92         if((!flag)&&(!Check(T, data)))
 93             flag = 1;
 94     }
 95     if(flag)
 96         return 0;
 97     else
 98         return 1;
 99 }
100 
101 int main()
102 {
103     int N, L;
104     int i, j, data;
105     BinTree SourceTree, CompareTree;
106     while(1) {
107         scanf("%d", &N);
108         if(!N) break;
109         scanf("%d", &L);
110         SourceTree = MakeTree(N);
111         // printf("InOrder:");
112         // InOrderTraversal(SourceTree);
113         // printf("\n");
114         for(i=0;i<L;i++) {
115             if(Judge(SourceTree, N))
116                 printf("Yes\n");
117             else
118                 printf("No\n");
119             ResetT(SourceTree);
120         }
121         FreeTree(SourceTree);
122     }
123     return 0;
124 }

 

posted @ 2018-04-11 10:51  习惯就好233  阅读(943)  评论(0编辑  收藏  举报