本题考查点有以下几个:

  1. 对数据输入的熟练掌握
  2. 二叉树的建立
  3. 二叉树的宽度优先遍历

首先,特别提一下第一点,整个题目有相当一部分耗时在了第一个考查点上(虽然有些不必要,因为本应该有更简单的方法)。这道题的输入有以下几种方案:

一次性输入并直接得到要得到的数据

输入后进行加工处理

对于第一种方案,我采用的是与正则相结合的方案

scanf("(%d%[,A-Z]) ",&d,s))

得到这样的写法可谓是费了一番功夫。难点有几个,最突出的是考虑数据不存在的情况:如()(1,)

我的解决方案是对于(1,)读取后边字母时顺带读取 ‘,’这样能避免s为空读取混乱的情况

对于()结束标记的判定,这就需要得到scanf的返回值,返回值为0,即代表读到了()。

还有一点,要知道这道题目可是有多个结束标记,多组数据的,因此呢,

while((k=scanf("(%d%[,A-Z]) ",&d,s))>=0)

while执行的条件是>=0,注意必须包括0,再在循环中判断k==0,k=0即一组数据结束的标记,别忘再加上

scanf("%*s ");

其读取到的是“ )”,至于为啥没有前括号可能是之前已经读了%d之前的那部分括号。


     关于第二个考查点,建立二叉树可以用静态数组来储存节点,也可以动态建立节点。在这里只能用动态来建(数据打大了!)

第三个考查宽度优先遍历,利用队列来完成这个操作。

下面附上AC代码1

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
struct Node{
    Node *left;
    Node *right;
    int value;
    Node():left(NULL),right(NULL){}
};
Node * root;
Node* newnode(){
    Node * t=new Node();
    t->value=0;
    return t;
}
int AddNode(int n, char *s){
    int len = strlen(s);
    Node* node=root;
    for(int i=0;i<len;i++){
        if(s[i] == 'L'){
            if(node->left == NULL){node->left = newnode();}
            node = node ->left;
        }
        else if(s[i] == 'R'){
            if(node->right == NULL)node->right = newnode();
            node = node ->right;
        }
    }
    if(!node->value){node->value=n;return 1;}
    else return 0;
}

bool bfs(vector<int>& ans){
    queue<Node*> q;
    ans.clear();
    q.push(root);
    while(!q.empty()){
        Node* u = q.front(); q.pop();
        if(!u->value)return false;
        ans.push_back(u->value);
        if(u->left != NULL)q.push(u->left);
        if(u->right != NULL)q.push(u->right);
    }
    return true;
}
void remove_tree(Node* u){
    if(u == NULL) return ;
    remove_tree(u->left);
    remove_tree(u->right);
    delete u;
}
int main(){
    #ifdef DEBUG
    freopen("6.7.in","r",stdin);
    freopen("6.7.out","w",stdout);   
    #endif
    root=newnode();
    int d=-1;
    int ok=1;
    int k;
    char s[10]={0};
    while((k=scanf("(%d%[,A-Z]) ",&d,s))>=0){
        if(k==0){
            if(ok) {
                vector<int> ans;
                if(bfs(ans)){
                    int first=1;
                    for(vector<int>::iterator it = ans.begin(); it != ans.end(); ++it){
                        if(!first)printf(" ");
                        else first=0;
                        cout << *it ;
                     }
                     printf("\n");

}
                else ok=0;
            }
            if(!ok)printf("not complete\n");
            ok=1;
            remove_tree(root);
            root=newnode();
            scanf("%*s ");
            continue;
        }
      // printf("(%d%s)\n%d",d,s,k);
        if(!ok)continue;
        if(!AddNode(d,&s[1]))ok=0;
    }

return 0;
}

例题6-7 Trees on the level ,Uva122的更多相关文章

  1. Trees on the level UVA - 122 复习二叉树建立过程,bfs,queue,strchr,sscanf的使用。

    Trees are fundamental in many branches of computer science (Pun definitely intended). Current state- ...

  2. E - Trees on the level

     Trees on the level  Background Trees are fundamental in many branches of computer science. Current ...

  3. Trees on the level(指针法和非指针法构造二叉树)

    Trees on the level Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. hdu 1622 Trees on the level(二叉树的层次遍历)

    题目链接:https://vjudge.net/contest/209862#problem/B 题目大意: Trees on the level Time Limit: 2000/1000 MS ( ...

  5. UVA.122 Trees on the level(二叉树 BFS)

    UVA.122 Trees on the level(二叉树 BFS) 题意分析 给出节点的关系,按照层序遍历一次输出节点的值,若树不完整,则输出not complete 代码总览 #include ...

  6. UVA 122 -- Trees on the level (二叉树 BFS)

     Trees on the level UVA - 122  解题思路: 首先要解决读数据问题,根据题意,当输入为“()”时,结束该组数据读入,当没有字符串时,整个输入结束.因此可以专门编写一个rea ...

  7. Uva122 Trees on the level

    Background Trees are fundamental in many branches of computer science. Current state-of-the art para ...

  8. uva-122 Trees on the level(树的遍历)

    题目: 给出一棵树的表示,判断这棵树是否输入正确,如果正确就按层次遍历输出所有的结点,错误的话就输出not complete. 思路: 根据字符串中树的路径先将树建起来,在增加结点和层次遍历树的时候判 ...

  9. 【例题 6-7 UVA - 122 】Trees on the level

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二叉树的话,直接用数组存就好了. 写个bfs记录一下答案. [代码] #include <bits/stdc++.h> ...

随机推荐

  1. iOS runtime 运行时( - )

    谈到运行时,相对应的就有编译时: 1).运行时-- 直到程序运行时才去确定一个对象的具体信息,并且可以改变这个类的具体信息,包括它的方法,变量等等: 2).编译时-- 是在程序运行之前,编译的时候,就 ...

  2. SQL Server 表和索引存储结构

    在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或 ...

  3. TCP/IP协议原理与应用笔记27:网际协议(IP)之 选项(Options)

    1. 选项(Options) (1)作用:网络测试或者调试,可选 (2)格式:0~40 bytes 2. 选项类型:

  4. 使用手机模拟器与android操作系统

    创建手机模拟器: 1. 点击Eclipse中新增的按钮,打开"Android Virtual Device Manager"(不同版本的ADT可能打开路径不同),如下图: 2. 点 ...

  5. 【Python Lib】解析HTML利器 BeautifulSoup

    - - 官方API文档,中文版 http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html - 以后会把常用的摘录出来

  6. iOS 犄角旮旯的知识

    1.全局变量 static NSInteger kImageHeight = 300; #define kImageHeight 300 2.通知中心 开始编辑 UITextViewTextDidBe ...

  7. 基于Jquery Validate 的表单验证

    基于Jquery Validate 的表单验证 jquery.validate.js是jquery下的一个验证插件,运用此插件我们可以很便捷的对表单元素进行格式验证. 在讲述基于Jquery Vali ...

  8. CentOS 7 使用外部邮箱 发送邮件和附件—mail,mailx

    1.查看软件包是否安装 [root@localhost ~]# rpm -qa|grep mail mailx-12.5-12.el7_0.x86_64 javamail-1.4.6-8.el7.no ...

  9. VMware系统运维(十五)部署虚拟化桌面Horizon View Manager 5.2添加vCenter Server服务器

    1.点击"添加...",进入到"添加vCenter Server"界面,输入服务器的IP地址,用户名密码,点击"下一步" 2.设置View ...

  10. LeetCode 287

    Find the Duplicate Number Given an array nums containing n + 1 integers where each integer is betwee ...