本题考查点有以下几个:

  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. CSS 之 嵌套 margin-top 处理

    如下代码: <div style=" width:1000px; height:700px; margin:auto;"> <div style=" w ...

  2. String、Brush、Color 相互转换

    1.String转换成Color Color color = (Color)ColorConverter.ConvertFromString(string); 2.String转换成Brush Bru ...

  3. 爬虫入门scrapy

    Python之路[第十九篇]:爬虫   网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...

  4. OC之Block的用法和实现委托

    Block的基本概念 Block的基本用法 Block实现委托机制 一.Block的基本概念 Block是程序的代码块,这个代码块可以在需要的时候执行.IOS开发中,block到处可见,所以学好很重要 ...

  5. Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现

    今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...

  6. linux_机器信息查询

    查看系统版本:[root@css-management ~]# lsb_release -aLSB Version: :core-4.0-amd64:core-4.0-noarch:graphics- ...

  7. codeforces 676C C. Vasya and String(二分)

    题目链接: C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input sta ...

  8. IP Camera Something

    ONVIF Device Manager http://sourceforge.net/projects/onvifdm/ http://synesis.ru/products/menedzher-u ...

  9. web服务器内置对象,或者说是ServletAPI的实例

    final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null;   // ...

  10. asp.net的简单分页程序

    *.apsx页面 1: <%@ Page Language="C#" Debug ="true" AutoEventWireup="true&q ...