题目:

给出一棵树的表示,判断这棵树是否输入正确,如果正确就按层次遍历输出所有的结点,错误的话就输出not complete。

思路:

根据字符串中树的路径先将树建起来,在增加结点和层次遍历树的时候判断这棵树是不是输入正确。

错误的两种情况:

1.同一个结点被输入的两次

2.这个结点的孩子有值,但这个结点没有被输入值。

判断方法:

根据字符串中给出的路径,将整棵树先建起来,每个结点中设一个是否被访问过的标志vis

增加结点时如果这个结点的vis已经为true则为错误的情况1。

遍历树的时候,如果这个结点已经建起来了,但是value没有被赋值,则为错误情况2。

最后利用队列对树进行层次遍历,并输出。

代码:

C++

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1e9;
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
struct Node{
Node* rt;
Node* lt;
int value;
bool vis;
Node(){
rt = lt = NULL;
value = ;
vis = false;
}
};
bool fail = false;
Node* root = new Node(); void removeTree(Node* u){//释放树占的内存空间
if(u==NULL) {return;}
removeTree(u->lt);
removeTree(u->rt);
delete u;
} int makeNum(string str){//提取字符串中的数字
int ans = ;
for(int i = ; str[i]!=','; i++){
ans = ans* + str[i]-'';
}
return ans;
} void addNode(Node* root,int value,string str){
Node* p = root;
for(int i = ; i<str.length(); i++){//忽略字符串中不是L和R的字符
if(str[i]=='L'){//L则向左建树
if(p->lt==NULL){
p->lt = new Node();
}
p = p->lt;
}else if(str[i]=='R'){//R则向右建树
if(p->rt==NULL){
p->rt = new Node();
}
p = p->rt;
}
}
if(p->vis){//如果这个结点已经被赋值,则是错误输入情况1
fail = true;
}
p->value = value;//赋值
p->vis = true;//标记已经访问过
} void printTree(Node* root){
vector<int> ans;
queue<Node*> que;
que.push(root);
while(!que.empty()){
Node* temp = que.front();
que.pop();
if(!temp->vis) fail = true;//如果这个结点被建出来,但是没有被赋值,则是错误情况2
ans.push_back(temp->value);
if(temp->lt) que.push(temp->lt);
if(temp->rt) que.push(temp->rt);
}
if(fail){
cout<<"not complete"<<endl;
}else{
cout<<ans[];
for(int i = ; i<ans.size(); i++){
cout<<" "<<ans[i];
}
cout<<endl;
}
} int main(){
string str;
while(cin>>str){
if(str=="()"){//这棵树输入结束,打印树
printTree(root);
removeTree(root);
root = new Node();
fail = false;
}else{
int value = makeNum(str);
//cout<<str<<" "<<value<<endl;
addNode(root, value, str);
}
}
return ;
}

Java

import java.io.*;
import java.util.*; class Node{
Node rt;
Node lt;
int value;
boolean vis;
public Node() {
rt = null;lt = null;
value = 0;vis = false;
}
} public class Main {
public static boolean fail = false;
public static void printTree(Node root) {
Queue<Node> que = new LinkedList<>();
LinkedList<Integer> list = new LinkedList<>();
if(root==null) {
fail = true;
}else {
que.offer(root);
while(!que.isEmpty()) {
Node temp = que.peek();que.poll();
if(!temp.vis) {fail = true;}
list.add(temp.value);
if(temp.lt!=null)
que.offer(temp.lt);
if(temp.rt!=null)
que.offer(temp.rt);
}
}
if(!fail) {
System.out.print(list.get(0));
for(int i = 1; i<list.size(); i++) {
System.out.print(" "+list.get(i));
}
System.out.println();
}else {
System.out.println("not complete");
}
} public static void addNode(Node root, int value, String str) {
Node p = root;
for(int i = 0; i<str.length(); i++) {
if(str.charAt(i)=='L') {
if(p.lt==null) {
p.lt = new Node();
}
p = p.lt;
}else if(str.charAt(i)=='R') {
if(p.rt==null) {
p.rt = new Node();
}
p = p.rt;
}
}
if(p.vis) {
fail = true;
}
p.value = value;
p.vis = true;
} public static int makeNum(String str) {
int num = 0;
for(int i = 1; str.charAt(i)!=','; i++) {
num = num*10 + str.charAt(i)-'0';
}
return num;
} public static void main(String[] args) {
Node root = new Node();
Scanner scan = new Scanner(System.in);
String str=null;
while(scan.hasNext()) {
str = scan.next();
if(str.equals("()")) {
printTree(root);
root = new Node();
fail = false;
}else {
int value = makeNum(str);
addNode(root, value, str);
}
}
scan.close();
}
}

用java做这个题的时候,利用split方法来处理字符串,结果一直是RE,找不出来了,就换了中方法(如上述代码中的)来实现,AC。

uva-122 Trees on the level(树的遍历)的更多相关文章

  1. UVa 122 Trees on the level(二叉树层序遍历)

    Trees are fundamental in many branches of computer science. Current state-of-the art parallel comput ...

  2. UVA.122 Trees on the level(二叉树 BFS)

    UVA.122 Trees on the level(二叉树 BFS) 题意分析 给出节点的关系,按照层序遍历一次输出节点的值,若树不完整,则输出not complete 代码总览 #include ...

  3. UVA 122 -- Trees on the level (二叉树 BFS)

     Trees on the level UVA - 122  解题思路: 首先要解决读数据问题,根据题意,当输入为“()”时,结束该组数据读入,当没有字符串时,整个输入结束.因此可以专门编写一个rea ...

  4. uva 122 trees on the level——yhx

    题目如下:Given a sequence of binary trees, you are to write a program that prints a level-order traversa ...

  5. UVa 122 Trees on the level

    题目的意思: 输入很多个节点,包括路径和数值,但是不一定这些全部可以构成一棵树,问题就是判断所给的能否构成一棵树,且没有多余. 网上其他大神已经给出了题目意思:比如我一直很喜欢的小白菜又菜的博客 说一 ...

  6. UVa 122 Trees on the level (动态建树 && 层序遍历二叉树)

    题意  :输入一棵二叉树,你的任务是按从上到下.从左到右的顺序输出各个结点的值.每个结 点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左 括号和右括号之间没有空格,相邻 ...

  7. UVa 122 Trees on the level(链式二叉树的建立和层次遍历)

    题目链接: https://cn.vjudge.net/problem/UVA-122 /* 问题 给出每个节点的权值和路线,输出该二叉树的层次遍历序列. 解题思路 根据输入构建链式二叉树,再用广度优 ...

  8. UVA - 122 Trees on the level (二叉树的层次遍历)

    题意:给定结点值和从根结点到该结点的路径,若根到某个叶结点路径上有的结点输入中未给出或给出超过一次,则not complete,否则层次遍历输出所有结点. 分析:先建树,建树的过程中,沿途结点都申请了 ...

  9. 内存池技术(UVa 122 Tree on the level)

    内存池技术就是创建一个内存池,内存池中保存着可以使用的内存,可以使用数组的形式实现,然后创建一个空闲列表,开始时将内存池中所有内存放入空闲列表中,表示空闲列表中所有内存都可以使用,当不需要某一内存时, ...

  10. Trees on the level UVA - 122 复习二叉树建立过程,bfs,queue,strchr,sscanf的使用。

    Trees are fundamental in many branches of computer science (Pun definitely intended). Current state- ...

随机推荐

  1. 【Silverlight】Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer)(转)

    [Silverlight]Bing Maps学习系列(四):使用图钉层(Pushpin layer)及地图图层(MapLayer) 如果我们需要在Bing Maps中加入一个小图钉标记,该如何实现了? ...

  2. MySQL 基础 —— 数据类型、各种变量

    1. 基本数据类型 char:prod_id char(10),括号内的内容表示字符的长度 decimal:十进制,不带参数为整数(四舍五入) text:文本类型,长度不限 2. 日期和时间处理函数 ...

  3. [luogu2620]虫洞

    https://www.zybuluo.com/ysner/note/1284536 题面 给一个一维坐标系,出发点为\(0\),目标点为\(w\). 每\(1\)秒可以往后移不超过\(s\)个单位距 ...

  4. bzoj4264

    哈希 cf原题...没见过的话真想不出来 将邻接表排序哈希,判断是否相同,但是会漏掉两点相邻的情况,于是再把自己加入自己的邻接表,然后再哈希判断. #include<bits/stdc++.h& ...

  5. 错误: 实例 "ruiy" 执行所请求操作失败,实例处于错误状态。: 请稍后再试 [错误: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)].

    错误: 实例 "ruiy" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: 'ascii' codec can't decode byte 0xe6 in posi ...

  6. Spark 多项式逻辑回归__二分类

    package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{L ...

  7. 解决Error for wireless request "Set Mode" (8B06) 问题 (转载)

    转自:http://blog.csdn.net/muge0913/article/details/17062871 在运行以下命令的时候,意外的出错,最后google了下,最终才确定了原因,因为在运行 ...

  8. 清北考前刷题day1下午好

    水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...

  9. python中多线程(1)

    一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 1.创建线程的开销比创建进程的开销小, ...

  10. error: no such device : 76de62ec-ac60-4c4d-bb Entering rescue mode .. grub resuce>(系统硬盘驱动器MBR已损坏)问题解决办法(图文详解)

    问题详情   近期,由于博主我,担任实验室整个大数据集群的leader,突然的断电给整个集群造成,如下的情况问题.(欲哭无泪,我的各种服务啊) 解决办法 第一种方法:尝试,直接重启机器(我这里是台式机 ...