zoukankan      html  css  js  c++  java
  • [刷题] PTA 04-树4 是否同一棵二叉搜索树

    程序:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 typedef struct TreeNode *Tree;
     4 struct TreeNode{
     5     int v;
     6     Tree Left,Right;
     7     int flag;
     8 };
     9 Tree NewNode(int V){
    10     Tree T=(Tree)malloc(sizeof(struct TreeNode));
    11     T->v = V;
    12     T->Left = T->Right=NULL;
    13     T->flag=0;
    14     return T;
    15 }
    16 Tree Insert(Tree T,int V){
    17     if(!T) T=NewNode(V);
    18     else{
    19         if(V>T->v)
    20         T->Right = Insert(T->Right,V);
    21         else
    22         T->Left = Insert(T->Left,V);
    23     }
    24     return T;
    25 } 
    26 //读数据建树T
    27 Tree MakeTree(int N){
    28     Tree T;
    29     int i,V;
    30     scanf("%d",&V);
    31     T = NewNode(V);
    32     for(i=1;i<N;i++){
    33         scanf("%d",&V);
    34         T=Insert(T,V); 
    35     }
    36     return T;
    37 }
    38 //查找结点 
    39 int check(Tree T,int V){
    40     if(T->flag){
    41         if(V<T->v) return check(T->Left,V);
    42         else if(V>T->v) return check(T->Right,V);
    43         else return 0;
    44     }else{
    45         if(V==T->v){
    46             T->flag = 1;
    47             return 1;
    48         }else return 0;
    49     }
    50 }
    51 int Judge(Tree T,int N){
    52     int i,V,flag = 0;  //flag:0代表目前还不一致,1代表已经不一致 
    53     scanf("%d",&V);
    54     if(V!=T->v) flag = 1;
    55     else T->flag = 1;
    56     for(i=1;i<N;i++){
    57         scanf("%d",&V);
    58         if((!flag)&&(!check(T,V))) flag = 1;
    59     }
    60     if(flag) return 0;
    61     else return 1;
    62 }
    63 //清除T中各节点flag标记 
    64 void ResetT(Tree T){
    65     if(T->Left) ResetT(T->Left);
    66     if(T->Right) ResetT(T->Right);
    67     T->flag = 0;
    68 }
    69 //释放T的空间
    70 void FreeTree(Tree T){
    71     if(T->Left) FreeTree(T->Left);
    72     if(T->Right) FreeTree(T->Right);
    73     free(T);
    74 } 
    75 //判别是否与T构成一样的树 
    76 int main(){
    77     int N,L,i;
    78     Tree T;
    79     scanf("%d",&N);
    80     while(N){
    81         scanf("%d",&L);
    82         T=MakeTree(N);
    83         for(i=0;i<L;i++){
    84             if(Judge(T,N)) printf("Yes
    ");
    85             else printf("No
    ");
    86             ResetT(T);  //flag清零 
    87         }
    88         FreeTree(T);  //数据清零 
    89         scanf("%d",&N);
    90     }
    91     return 0; 
    92 }

    分析:

    • 用链表存储树
  • 相关阅读:
    康托(逆)展开(2015.8.6)
    高精度计算(2015.8.1)
    笔记(2015.8.1)
    筛法求素数(2015.7.30)
    欧几里德算法(2015.7.28)
    快速幂取模(2015.7.29)
    同余
    图论相关算法
    笔记(2015-07-24)
    ACM进阶计划
  • 原文地址:https://www.cnblogs.com/cxc1357/p/10810099.html
Copyright © 2011-2022 走看看