• 04-树4 是否同一棵二叉搜索树


    二叉搜索树

    给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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 //建一颗树,判别其他序列是否与其一致 
      2 #include <stdio.h>
      3 #include <stdlib.h>
      4 
      5 typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
      6 typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
      7 
      8 typedef struct TreeNode *Tree;
      9 struct TreeNode
     10 {
     11     ElemType data;
     12     Tree left,right;
     13     int flag;    //被访问过为1 否则0 
     14 }; 
     15 
     16 Tree NewNode(ElemType data);
     17 Tree Insert(Tree T,ElemType data);
     18 Tree MakeTree(int N);
     19 bool check (Tree T,ElemType data);
     20 int Judge(Tree T,int N);
     21 void ResetT(Tree T);
     22 void FreeTree(Tree T);
     23 
     24 Tree NewNode(ElemType data)
     25 {
     26     Tree T = (Tree)malloc(sizeof(struct TreeNode));
     27     T->data = data;
     28     T->left = T->right = NULL;
     29     T->flag = 0;
     30     return T;
     31 }
     32 
     33 Tree Insert(Tree T,ElemType data)
     34 {
     35     if( !T )
     36         T = NewNode(data);
     37     else {
     38         if(data > T->data)
     39             T->right = Insert(T->right, data);
     40         else
     41             T->left = Insert(T->left, data);
     42     }
     43     return T;
     44 }
     45 
     46 Tree MakeTree(int N)
     47 {
     48     Tree T;
     49     ElemType data;
     50     scanf("%d",&data);
     51     T = NewNode(data);
     52     for(int i = 1; i < N; i++) {
     53         scanf("%d",&data);
     54         T = Insert(T,data);
     55     }
     56     return T;
     57 }
     58 
     59 bool check (Tree T,ElemType data)
     60 {
     61     if(T->flag) {
     62         if(data < T->data)
     63             return check(T->left,data);
     64         else if(data > T->data)
     65             return check(T->right,data);
     66     }else {
     67         if(data == T->data) {    //是要找的结点 
     68             T->flag = 1;
     69             return true;
     70         }
     71         else return false;            //不是 不一致 
     72     }
     73 }
     74 
     75 int Judge(Tree T,int N)
     76 {
     77     ElemType data;
     78     int flag = 0;//0代表目前仍一致 1代表已经不一致
     79     scanf("%d",&data);
     80     if(data != T->data)    //    判断根节点是否一致 
     81         flag = 1; 
     82     else T->flag = 1;
     83     for(int i = 1; i < N; i++) {    //确保L读完 
     84         scanf("%d",&data);
     85         if( (!flag) && (!check(T,data)) )    //不一致 
     86             flag = 1;
     87     }
     88     if(flag)     //不一致 
     89         return 0;
     90     else return 1;
     91 }
     92 
     93 void ResetT(Tree T)//清除T中各结点的flag标记
     94 {
     95     if(T->left)
     96         ResetT(T->left);
     97     if(T->right)
     98         ResetT(T->right);
     99     T->flag = 0;
    100 } 
    101 
    102 void FreeTree(Tree T) //释放T的空间
    103 {
    104     if(T->left)
    105         FreeTree(T->left);
    106     if(T->right)
    107         FreeTree(T->right);
    108     free(T);
    109 } 
    110 
    111 int main()
    112 {
    113     int N, L;
    114     Tree T;
    115     scanf("%d",&N);
    116     while(N) {
    117         scanf("%d",&L);
    118         T = MakeTree(N);
    119         for(int i = 0; i < L; i++) {
    120             if(Judge(T, N))
    121                 printf("Yes
    ");
    122             else
    123                 printf("No
    ");
    124             ResetT(T);        //清除T中的标记flag 
    125         } 
    126         FreeTree(T);
    127         scanf("%d",&N);
    128     }
    129     
    130     return 0;
    131 }
     
  • 相关阅读:
    习惯的本质:逐步建立新的常态
    如何度过有用的每一天
    如何利用晚上八点到十点这段时间自我提升
    为什么很多年轻人总会感到迷茫
    当你学会专注,人生才算真正成熟
    如何过上简单的生活
    游标
    触发器

    函数
  • 原文地址:https://www.cnblogs.com/kuotian/p/5309032.html
Copyright © 2020-2023  润新知