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 }
  • 相关阅读:
    使用NBU进行oracle异机恢复
    mycat偶尔会出现JVM报错double free or corruption并崩溃退出
    exp导出数据时丢表
    service_names配置不正确,导致dg创建失败
    XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
    HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
    【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
    java内部类深入详解 内部类的分类 特点 定义方式 使用
    再谈包访问权限 子类为何不能使用父类protected方法
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4737182.html
Copyright © 2011-2022 走看看