例题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> ...
随机推荐
- LeetCode31 Next Permutation
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- Cable master(二分题 注意精度)
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26596 Accepted: 5673 Des ...
- cigarettes
描述 Tom has many cigarettes. We hypothesized that he has n cigarettes and smokes them one by one keep ...
- react-redux-react-router直通车
简单说明 这篇文章是我学习react一个多月来的总结,从基础开始(包括编辑器设置,构建工具搭建),一步一步走向react开发.相信我,看完这篇文章,跟着文章的步骤走,保证让你入门react并爱上rea ...
- MVC+easyui 完整实现
学习mvc半月有余,趁几天假期,没事做就动手做一个完整的网站玩玩,顺便和上家公司的方法做个比较.页面引擎采用mvc自带的功能,建立视图,交给.net自带渲染出页面(对比:上家公司采用的第三方组件渲染的 ...
- 移动端 viewport设置
<meta name="viewport" content="" /> width [pixel_value | device-width] wid ...
- umbraco使用VS安装
新建——程序包管理器控制台——install - package umbracocms vs中的快捷键: ctrl+F5为调试: ctrl+shift+B生成解决方案: 打包前,App_data文件夹 ...
- DWZ框架Ajax无刷新表单提交处理流程
DWZ框架Ajax无刷新表单提交处理流程是: 1. ajax表单提交给服务器 2. 服务器返回一个固定格式json结构 3. js会调函数根据这个json数据做相应 ...
- Shuffle an Array
class Solution { private: vector<int> arr, idx; public: Solution(vector<int> nums) { sra ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...