zoukankan      html  css  js  c++  java
  • 是否同一棵二叉搜索树

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



  • 相关阅读:
    1041. 困于环中的机器人
    95. 不同的二叉搜索树 II
    LeetCode945:使数组唯一的最小增量
    LeetCode:925.长按键入
    LeetCode:926. 将字符串翻转到单调递增
    InteliJ 安装PlantUML插件
    CodeBlock换肤
    正则表达式验证手机号和座机号
    C#中使用反射遍历一个对象属性和值以及百分数
    c#中@的用法
  • 原文地址:https://www.cnblogs.com/jinjin-2018/p/8718648.html
Copyright © 2011-2022 走看看