• 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("
    ");
    114         for(i=0;i<L;i++) {
    115             if(Judge(SourceTree, N))
    116                 printf("Yes
    ");
    117             else
    118                 printf("No
    ");
    119             ResetT(SourceTree);
    120         }
    121         FreeTree(SourceTree);
    122     }
    123     return 0;
    124 }
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    网络兼职轻松赚
    微信H5支付demo
    支付宝H5支付demo
    笔记本安装SSD固态硬盘详细的优化设置
    JQuery的AJAX
    第二次面试
    存储过程的总结
    SQl数据操作和查询
    面对考试毫无畏惧的SSH
    掷骰子-IOS新手项目练习(抱歉,由于个人原因,图片没显示,要源码的项目私聊)
  • 原文地址:https://www.cnblogs.com/ch122633/p/8794342.html
Copyright © 2020-2023  润新知