例题6-7 Trees on the level ,Uva122
本题考查点有以下几个:
- 对数据输入的熟练掌握
- 二叉树的建立
- 二叉树的宽度优先遍历
首先,特别提一下第一点,整个题目有相当一部分耗时在了第一个考查点上(虽然有些不必要,因为本应该有更简单的方法)。这道题的输入有以下几种方案:
一次性输入并直接得到要得到的数据
输入后进行加工处理
对于第一种方案,我采用的是与正则相结合的方案
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的更多相关文章
- Trees on the level UVA - 122 复习二叉树建立过程,bfs,queue,strchr,sscanf的使用。
Trees are fundamental in many branches of computer science (Pun definitely intended). Current state- ...
- E - Trees on the level
Trees on the level Background Trees are fundamental in many branches of computer science. Current ...
- Trees on the level(指针法和非指针法构造二叉树)
Trees on the level Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- hdu 1622 Trees on the level(二叉树的层次遍历)
题目链接:https://vjudge.net/contest/209862#problem/B 题目大意: Trees on the level Time Limit: 2000/1000 MS ( ...
- UVA.122 Trees on the level(二叉树 BFS)
UVA.122 Trees on the level(二叉树 BFS) 题意分析 给出节点的关系,按照层序遍历一次输出节点的值,若树不完整,则输出not complete 代码总览 #include ...
- UVA 122 -- Trees on the level (二叉树 BFS)
Trees on the level UVA - 122 解题思路: 首先要解决读数据问题,根据题意,当输入为“()”时,结束该组数据读入,当没有字符串时,整个输入结束.因此可以专门编写一个rea ...
- Uva122 Trees on the level
Background Trees are fundamental in many branches of computer science. Current state-of-the art para ...
- uva-122 Trees on the level(树的遍历)
题目: 给出一棵树的表示,判断这棵树是否输入正确,如果正确就按层次遍历输出所有的结点,错误的话就输出not complete. 思路: 根据字符串中树的路径先将树建起来,在增加结点和层次遍历树的时候判 ...
- 【例题 6-7 UVA - 122 】Trees on the level
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二叉树的话,直接用数组存就好了. 写个bfs记录一下答案. [代码] #include <bits/stdc++.h> ...
随机推荐
- CSS 之 嵌套 margin-top 处理
如下代码: <div style=" width:1000px; height:700px; margin:auto;"> <div style=" w ...
- String、Brush、Color 相互转换
1.String转换成Color Color color = (Color)ColorConverter.ConvertFromString(string); 2.String转换成Brush Bru ...
- 爬虫入门scrapy
Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用 ...
- OC之Block的用法和实现委托
Block的基本概念 Block的基本用法 Block实现委托机制 一.Block的基本概念 Block是程序的代码块,这个代码块可以在需要的时候执行.IOS开发中,block到处可见,所以学好很重要 ...
- Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现
今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...
- linux_机器信息查询
查看系统版本:[root@css-management ~]# lsb_release -aLSB Version: :core-4.0-amd64:core-4.0-noarch:graphics- ...
- codeforces 676C C. Vasya and String(二分)
题目链接: C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input sta ...
- IP Camera Something
ONVIF Device Manager http://sourceforge.net/projects/onvifdm/ http://synesis.ru/products/menedzher-u ...
- web服务器内置对象,或者说是ServletAPI的实例
final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; // ...
- asp.net的简单分页程序
*.apsx页面 1: <%@ Page Language="C#" Debug ="true" AutoEventWireup="true&q ...