本题考查点有以下几个:

  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. PostMessager来对子父窗体进行跨域

    一.为什么需要使用postMessage这个跨域技术 对于一个普通的页面而言,如果页面中的数据量太多时,会导致某个页面的数据量太多 二显得特别的臃肿,所以通常是使用iframe的方式来加载子页面,但是 ...

  2. iOS CoreData 增删改查详解

    最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...

  3. highchart 导出图片, 显示空白

    使用highchart时, 导出的图片会变空白..   解决方案: 不要加载grid.js

  4. mysql存储过程详解[转]

    1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...

  5. Java Swing 绝对布局管理方法,null布局(转)

    首先把相关容器的布局方式设为 setLayout(null); 然后调用组件的  setBounds() 方法 设置button的位置为(100,100) 长宽分别为 60,25 jButton.se ...

  6. python中如何删除列表中的所有元素

    今天写代码的时候遇到一个小问题,Python中要删除列表中的所有元素.Python本身就提供了pop.remove.del这些删除的函数.我想着用循环实现,结果很麻烦.几番周折上了stackoverf ...

  7. Practice 10

    通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. settext是根据数组新建的pets[1]object来的,对其调用抽象方法talk, ...

  8. tensorflow进阶篇-5(反向传播1)

    这里将讲解tensorflow是如何通过计算图来更新变量和最小化损失函数来反向传播误差的:这步将通过声明优化函数来实现.一旦声明好优化函数,tensorflow将通过它在所有的计算图中解决反向传播的项 ...

  9. Android 桌面部件

    桌面部件是一种利用AppWidget框架将应用程序的某个部件放在桌面. res/layout/digitalclock.xml <?xml version="1.0" enc ...

  10. html select与option标签

    1.select 元素 select 元素可创建单选或多选菜单.<select> 元素中的 <option> 标签用于定义列表中的可用选项 常用属性如下: autofocus: ...