本题考查点有以下几个:

  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. LeetCode31 Next Permutation

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  2. Cable master(二分题 注意精度)

    Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26596   Accepted: 5673 Des ...

  3. cigarettes

    描述 Tom has many cigarettes. We hypothesized that he has n cigarettes and smokes them one by one keep ...

  4. react-redux-react-router直通车

    简单说明 这篇文章是我学习react一个多月来的总结,从基础开始(包括编辑器设置,构建工具搭建),一步一步走向react开发.相信我,看完这篇文章,跟着文章的步骤走,保证让你入门react并爱上rea ...

  5. MVC+easyui 完整实现

    学习mvc半月有余,趁几天假期,没事做就动手做一个完整的网站玩玩,顺便和上家公司的方法做个比较.页面引擎采用mvc自带的功能,建立视图,交给.net自带渲染出页面(对比:上家公司采用的第三方组件渲染的 ...

  6. 移动端 viewport设置

    <meta name="viewport" content="" /> width [pixel_value | device-width] wid ...

  7. umbraco使用VS安装

    新建——程序包管理器控制台——install - package umbracocms vs中的快捷键: ctrl+F5为调试: ctrl+shift+B生成解决方案: 打包前,App_data文件夹 ...

  8. DWZ框架Ajax无刷新表单提交处理流程

    DWZ框架Ajax无刷新表单提交处理流程是: 1.       ajax表单提交给服务器 2.       服务器返回一个固定格式json结构 3.       js会调函数根据这个json数据做相应 ...

  9. Shuffle an Array

    class Solution { private: vector<int> arr, idx; public: Solution(vector<int> nums) { sra ...

  10. hdu 4117 GRE Words AC自动机DP

    题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...