例题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> ...
随机推荐
- PostMessager来对子父窗体进行跨域
一.为什么需要使用postMessage这个跨域技术 对于一个普通的页面而言,如果页面中的数据量太多时,会导致某个页面的数据量太多 二显得特别的臃肿,所以通常是使用iframe的方式来加载子页面,但是 ...
- iOS CoreData 增删改查详解
最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...
- highchart 导出图片, 显示空白
使用highchart时, 导出的图片会变空白.. 解决方案: 不要加载grid.js
- mysql存储过程详解[转]
1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 ...
- Java Swing 绝对布局管理方法,null布局(转)
首先把相关容器的布局方式设为 setLayout(null); 然后调用组件的 setBounds() 方法 设置button的位置为(100,100) 长宽分别为 60,25 jButton.se ...
- python中如何删除列表中的所有元素
今天写代码的时候遇到一个小问题,Python中要删除列表中的所有元素.Python本身就提供了pop.remove.del这些删除的函数.我想着用循环实现,结果很麻烦.几番周折上了stackoverf ...
- Practice 10
通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. settext是根据数组新建的pets[1]object来的,对其调用抽象方法talk, ...
- tensorflow进阶篇-5(反向传播1)
这里将讲解tensorflow是如何通过计算图来更新变量和最小化损失函数来反向传播误差的:这步将通过声明优化函数来实现.一旦声明好优化函数,tensorflow将通过它在所有的计算图中解决反向传播的项 ...
- Android 桌面部件
桌面部件是一种利用AppWidget框架将应用程序的某个部件放在桌面. res/layout/digitalclock.xml <?xml version="1.0" enc ...
- html select与option标签
1.select 元素 select 元素可创建单选或多选菜单.<select> 元素中的 <option> 标签用于定义列表中的可用选项 常用属性如下: autofocus: ...