是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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

AC代码

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



原文地址:https://www.cnblogs.com/jinjin-2018/p/8718648.html