zoukankan      html  css  js  c++  java
  • pat04-树7. Search in a Binary Search Tree (25)

    04-树7. Search in a Binary Search Tree (25)

    时间限制
    100 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    To search a key in a binary search tree, we start from the root and move all the way down, choosing branches according to the comparison results of the keys. The searching path corresponds to a sequence of keys. For example, following {1, 4, 2, 3} we can find 3 from a binary search tree with 1 as its root. But {2, 4, 1, 3} is not such a path since 1 is in the right subtree of the root 2, which breaks the rule for a binary search tree. Now given a sequence of keys, you are supposed to tell whether or not it indeed correspnds to a searching path in a binary search tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives two positive integers N and M (<=100) which are the total number of sequences, and the size of each sequence, respectively. Then N lines follow, each gives a sequence of keys. It is assumed that the keys are numbered from 1 to M.

    Output Specification:

    For each sequence, print in a line "YES" if the sequence does correspnd to a searching path in a binary search tree, or "NO" if not.

    Sample Input:
    3 4
    1 4 2 3
    2 4 1 3
    3 2 4 1
    
    Sample Output:
    YES
    NO
    NO
    

    提交代码

    法一:

    如果是二叉查找树,树上除了叶结点,每个节点的左右子树必有一棵空,另一棵不空。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 using namespace std;
     8 struct node{
     9     int v;
    10     node *l,*r;
    11     node(){
    12         l=r=NULL;
    13     }
    14 };
    15 int main(){
    16     //freopen("D:\INPUT.txt","r",stdin);
    17     int n,m;
    18     scanf("%d %d",&n,&m);
    19     while(n--){
    20         queue<int> q;
    21         int i,num;
    22         node *p,*pp,*h=NULL;
    23         for(i=0;i<m;i++){
    24             scanf("%d",&num);
    25             q.push(num);
    26         }
    27         h=new node();
    28         h->v=q.front();
    29         q.pop();
    30         for(i=1;i<m;i++){
    31             num=q.front();
    32             q.pop();
    33             p=h;
    34             while(p){
    35                 pp=p;//pp point to the father of p
    36                 if(num>p->v&&p->l==NULL){
    37                     p=p->r;
    38                 }
    39                 else{
    40                     if(num<p->v&&p->r==NULL){
    41                         p=p->l;
    42                     }
    43                     else
    44                         break;//防止元素相等
    45                 }
    46             }
    47             if(p==NULL){
    48                 p=new node();
    49                 p->v=num;
    50                 if(num>pp->v){
    51                     pp->r=p;
    52                 }
    53                 else{
    54                     pp->l=p;
    55                 }
    56             }
    57             else{
    58                 break;
    59             }
    60         }
    61         if(i==m){
    62             printf("YES
    ");
    63         }
    64         else{
    65             printf("NO
    ");
    66         }
    67     }
    68     return 0;
    69 }

    法二:

    先按题意建树,得到树后,用最后输入的数进行树的遍历,如果最后经过m次找到匹配的叶结点,说明序列正确;否则,序列错误。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 using namespace std;
     8 struct node{
     9     int v;
    10     node *l,*r;
    11     node(){
    12         l=r=NULL;
    13     }
    14 };
    15 int main(){
    16     //freopen("D:\INPUT.txt","r",stdin);
    17     int n,m;
    18     scanf("%d %d",&n,&m);
    19     while(n--){
    20         queue<int> q;
    21         int i,num,wantfind;
    22         node *p,*pp,*h;
    23         for(i=0;i<m;i++){
    24             scanf("%d",&num);
    25             q.push(num);
    26         }
    27         wantfind=num;  //最后一个
    28         h=new node();
    29         h->v=q.front();
    30         q.pop();
    31         for(i=1;i<m;i++){ //建树
    32             num=q.front();
    33             q.pop();
    34             p=h;
    35             while(p){
    36                 pp=p;//pp point to the father of p
    37                 if(num>p->v){
    38                     p=p->r;
    39                 }
    40                 else{
    41                     p=p->l;
    42                 }
    43             }
    44             p=new node();
    45             p->v=num;
    46             if(num>pp->v){
    47                 pp->r=p;
    48             }
    49             else{
    50                 pp->l=p;
    51             }
    52         }
    53         int count=0;
    54         p=h;
    55         while(p){
    56             if(wantfind>p->v){
    57                 p=p->r;
    58             }
    59             else{
    60                 p=p->l;
    61             }
    62             count++;
    63         }
    64         if(count==m){
    65             printf("YES
    ");
    66         }
    67         else{
    68             printf("NO
    ");
    69         }
    70     }
    71     return 0;
    72 }
  • 相关阅读:
    MongoDB Shell
    mongo 日记
    java 堆栈 静态
    面向对象(2)
    面向对象(1)
    mongo 学习笔记
    深入浅出学Spring Data JPA
    java记录
    mongodb 2.6 window 安装启动服务
    CF1012F Passports
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4737182.html
Copyright © 2011-2022 走看看