例题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> ...
随机推荐
- Remap BMW F11 2010 all ECUs with E-Sys and ENET cable
Just wanted to share some experiences remaping all the ECUs in my F11 2010 BMW, hopefully other BMW ...
- Java学习笔记——JDK1.7的新特性。
1,switch中可以使用字串 Java代码: String s = "test"; switch (s) { case "test" : System.out ...
- Ubuntu14.04 搭建 node.js 环境(Binaries方式)
从官网下载 http://nodejs.org/download/ Linux Binaries (.tar.gz) 下载下来的是node-v0.10.29-linux-x64.tar.gz文件 解 ...
- Windows8不联网直接安装.Net 3.5 Framework的方法
把你的系统ISO加载到虚拟光驱或插入系统安装盘,找到X:\sources\sxs路径(X是你的光驱盘符).输入下面命令,盘符以D盘为例DISM /Online /Enable-Feature /Fea ...
- js 回车键 跳转到下一个输入框
window.document.onkeydown(){ if(event.keyCode==13) event.keyCode=9; }
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!&&在eclipse.ini中为eclipse指定jdk启动
参考:http://blog.csdn.net/zyz511919766/article/details/7442633 http://blog.sina.com.cn/s/blog_028f0c1c ...
- 初识 Asp.Net内置对象之Server对象
Server对象 Server对象定义了一个于Web服务器相关联的类提供对服务器上的方法和属性的访问,用于访问服务器上的资源. Server对象的常用属性 属性 MarhineName 获取服务器 ...
- /var/spool/postfix/maildrop小文件太多造成inode索引使用完解决
/var/spool/postfix/maildrop 小文件太多造成inode索引使用完解决办法 问题表现和检查: 1.运行df -i / 查看inode使用是否满: 2.查看/var/spool/ ...
- java实现Composite(组合)模式
组合模式涉及的是一组对象,其中一些对象可能含有其他对象,这些对象也可以含有对象,因此,有些对象代表的是对象群组. Composite模式的设计意图在于:让所有的用户能够用统一的接口处理单个对象以及对象 ...
- .NET DLL 保护措施详解(五)常规条件下的破解
为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密 ...