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


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

    一开始是想要建两棵树用来互相比较的,但是试了很多次都没能拿满分
    下面是几乎全仿浙江大学慕课数据结构课程的做法,代码稍微有点长
    其核心思想是:只
    建一颗树,判别其他序列是否与其一致
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 
      5 typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
      6 
      7 typedef struct TreeNode *Tree;
      8 struct TreeNode
      9 {
     10     ElemType data;
     11     Tree left,right;
     12     int flag;    //被访问过为1 否则0
     13 };
     14 
     15 Tree NewNode(ElemType data);
     16 Tree Insert(Tree T,ElemType data);
     17 Tree MakeTree(int N);
     18 int check (Tree T,ElemType data);
     19 int Judge(Tree T,int N);
     20 void ResetT(Tree T);
     21 void FreeTree(Tree T);
     22 
     23 int main()
     24 {
     25     int N,L;
     26     Tree T;
     27     int i;
     28 
     29     scanf("%d",&N);
     30 
     31     while( N )
     32     {
     33         scanf("%d",&L);
     34         T = MakeTree( N );
     35         for( i=0; i<L; i++)
     36         {
     37             if( Judge(T,N))
     38             {
     39                 printf("Yes
    ");
     40             }
     41             else
     42             {
     43                 printf("No
    ");
     44             }
     45             ResetT( T );  //清除flag标记
     46         }
     47         FreeTree( T );
     48         scanf("%d",&N);
     49     }
     50 
     51     return 0;
     52 }
     53 
     54 
     55 Tree NewNode(ElemType data)
     56 {
     57     //创建一个新的结点
     58     Tree T = (Tree) malloc(sizeof(struct TreeNode));
     59     T->data = data;
     60     T->flag = 0;
     61     T->left = T->right =NULL;
     62     return T;
     63 }
     64 
     65 
     66 Tree Insert(Tree T,ElemType data)
     67 {
     68     //插入一个新的结点
     69 
     70     if( !T ){
     71         T = NewNode(data);
     72     }
     73     else{
     74     if( data > T->data)
     75     {
     76         T->right = Insert( T->right,data);
     77     }
     78     else if( data < T->data )
     79     {
     80         T->left = Insert( T->left,data);
     81     }
     82 
     83     //相等则不插入
     84     }
     85 
     86     return T;
     87 }
     88 Tree MakeTree(int N)
     89 {
     90     Tree T;
     91     ElemType data;
     92     int i;
     93 
     94     scanf("%d",&data);
     95     T = NewNode( data );
     96     for( i=1; i<N; i++)
     97     {
     98         scanf("%d",&data);
     99         T = Insert( T,data);
    100     }
    101     return T;
    102 }
    103 int check (Tree T,ElemType data)
    104 {
    105     if( T->flag )
    106     {
    107         if( data < T->data)
    108         {
    109             return check( T->left,data );
    110         }
    111         else if( data > T->data)
    112         {
    113             return check( T->right,data);
    114         }
    115     }
    116     else
    117     {
    118         if( data == T->data)
    119         {
    120             T->flag = 1;
    121             return 1;
    122         }
    123         else return 0;
    124     }
    125 }
    126 
    127 int Judge(Tree T,int N)
    128 {
    129     //检验需验证的树是否跟已经构建的树一致
    130     ElemType data;
    131     int flag = 0;
    132     int i ;
    133     scanf("%d",&data);
    134     if( data != T->data)
    135     {
    136         flag = 1;  //根节点不一致
    137     }
    138     else
    139     {
    140         T->flag = 1;
    141     }
    142 
    143     for( i=1; i<N; i++)
    144     {
    145         scanf("%d",&data);
    146         if( (!flag) && (!check(T,data)))
    147         {
    148             flag = 1;
    149         }
    150     }
    151     if(flag)  return 0;
    152     else return 1;
    153 }
    154 
    155 void ResetT(Tree T)
    156 {
    157     if(T->left)
    158     {
    159         ResetT(T->left);
    160     }
    161     if(T->right)
    162     {
    163         ResetT(T->right);
    164     }
    165     T->flag = 0;
    166 }
    167 
    168 void FreeTree(Tree T)
    169 {
    170     if(T->left)
    171     {
    172         FreeTree(T->left);
    173     }
    174     if(T->right)
    175     {
    176         FreeTree(T->right);
    177     }
    178     free(T);
    179 }
     
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    路飞项目五
    路飞项目四
    路飞项目三
    路飞项目二
    基本数据类型之集合和字符编码
    3.11 作业
    基本数据类型内置方法
    3.10 作业
    流程控制之for循环、基本数据类型及其内置方法
    3.9 作业
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8331404.html
Copyright © 2020-2023  润新知