例题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> ...
随机推荐
- C++ atol
函数名: atol 功 能: 把字符串转换成长整型数 用 法: long atol(const char *nptr); 简介编辑 相关函数: atof,atoi,strtod,strtol,st ...
- iOS 手机 邮箱 正则表达式
//iOS代码//判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex ...
- nodejs的mysql模块学习(七)连接池事件
连接池事件 connection 当建立连接的时候就会触发 pool.on('connection' function(connection){ connection.query('SET SESSI ...
- ArcGIS 投影转换(AE)
private void btnOK_Click(object sender, EventArgs e) { try { CheckError(); this.checkEdit1.Enabled = ...
- 百度地图开发之poi检索,线路规划
官方文档 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key 先去官方文档申请秘钥下载压缩文件等操作,参考 百度地图的秘钥申请 ...
- Java学习笔记——字符串常用函数
class JavaTest4_String { public static void main(String[] args) { String str1 = "IOS,ANDROID,BB ...
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法 ...
- CSS/CSS3 如何实现元素水平居中
更新:可直接访问 [CSS/CSS3 如何实现元素水平居中] 查看效果,右键查看源代码 -------------------------------------------------分割线---- ...
- Umbraco(2) - Creating Your First Template and Content Node(翻译文档)
创建(编辑)你的第一个模板(Template) 展开 Settings > Templates文件夹 - 然后你应该看到子节点名为"Homepage" - 这是我们在创建Do ...
- HDU 2084 数塔 (DP)
数塔 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Pr ...