PTA数据结构与算法题目集(中文) 7-4

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\n");
 99             else
100                 printf("No\n");
101             Free(B);
102             B = NULL;
103         }
104         Free(A);
105         A = NULL;
106         scanf("%d", &N);
107     }
108     return 0;
109 }
View Code

 

 
posted @ 2019-09-24 18:23  57one  阅读(487)  评论(0编辑  收藏  举报