题目的意思:

输入很多个节点,包括路径和数值,但是不一定这些全部可以构成一棵树,问题就是判断所给的能否构成一棵树,且没有多余。

网上其他大神已经给出了题目意思:比如我一直很喜欢的小白菜又菜的博客

说一声: 

之前看了网上好多代码,看的大段大段的,看不下去了,就准备自己写了,结果写出来也是大段大段的,其实中间有不少是被注释掉的测试代码,可忽略不计!



// 测试样例:udebug :链接

// 我整个代码最核心的整体思想就是把全部节点放到map中,

// 然后层级遍历到的就放到vector(V)中,并从map中删除(重点),最后如果map有剩余就认为not complete!

<span style="font-family:Courier New;font-size:14px;">#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <map>
#include <queue>
using namespace std;
struct s{
    string path;   //节点路径
    int value;      //节点值
};
vector <int> v;     //存放可输出的树的节点
map <string, int> m;  //存放树
map <string, int> ::iterator it,it1,it2;
queue <s> q;
//这个地方是重点,就是如何层级输遍历输出;
//在网上看了一下,层级遍历可以用队列,对于每个在队列里面的pop之后,把他的左儿子和右儿子加到队列里(如果有)
void levelordertravel(){
    s temp;
    string t,t1,x,y;
    //如果连根都没有,直接返回了
    it=m.find("");
    if(it!=m.end()) q.push({it->first,it->second});
    else return;
    while(!q.empty()){
        temp=q.front();
        //cout<<temp<<endl;
        v.push_back(temp.value);
        t=temp.path;
        t1=t;
        m.erase(t);
        q.pop();
        //对于每个path,在map找加L和加R的
        x=t.append("L");
        it1=m.find(x);
        y=t1.append("R");
        it2=m.find(y);

        if(it1!=m.end()){
            q.push({it1->first,it1->second});
            //cout<<"left son is in"<<endl;
        }
        if(it2!=m.end()){
            q.push({it2->first,it2->second});
            //cout<<"rigth son is in"<<endl;
        }
    }
}
bool input(){
    string str;
    while(cin>>str){
        string path, value1;
        int value, p, length;
        if(str == "()") break;
        length = str.length();
        p = str.find(',');  //,的位置
        value1 = str.substr(1,p-1);
        value = atoi(value1.c_str());  //这个地方把string转换成int
        path = str.substr(p+1,length-1-(p+1));
        it=m.find(path);
        if(it!=m.end()) path="XXX";
        m[path] = value;
    }
    return !cin.eof();
}
int main()
{
    while(input()){   //这里的输入,没有循环输入的话就会wronganswer 就因为这个问题花费了很久时间
    //int len=m.size();
    //for(it=m.begin();it!=m.end();it++) cout<<it->first<<" "<<it->second<<endl;
    //cout<<endl;
    levelordertravel();
//    for(int i=0;i<v.size();i++){
//            cout<<v[i];
//            if(i!=v.size()-1) cout<<" ";
//        }
//        cout<<endl;
    if(m.size()!=0) cout<<"not complete"<<endl;
    if(m.size()==0){
        for(int i=0;i<v.size();i++){
            cout<<v[i];
            if(i!=v.size()-1) cout<<" ";
        }
        cout<<endl;
    }
    m.clear();
    v.clear();
    }
    return 0;
}</span>

UVa 122 Trees on the level的更多相关文章

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

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

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

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

  3. 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 ...

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

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

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

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

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

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

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

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

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

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

  9. 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. Visual Studio 2010的MSDN帮助文档离线使用

    如果没有在安装vs过程中安装帮助,也可通过Visual Studio帮助菜单中的Manage Help Settings来对帮助进行设置或安装. 可以选择从磁盘安装内容,如果选择从磁盘安装可能会要求提 ...

  2. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  3. 百度MIP页规范详解 —— canonical标签

    百度MIP的规范要求必须添加强制性标签canonical,不然MIP校验工具会报错: 强制性标签<link rel="/^(canonical)$/"> 缺失或错误 这 ...

  4. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  5. C#中将DataTable导出为HTML的方法

    今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...

  6. Take into Action!

    很久没有认真地写文字了. 刚毕业一两年断断续续在csdn上写过一些当时的工作记录,然后没有坚持下去.有时候是觉得自己不牛,记录的东西旁人看起来也许不值一提:有时候觉得结婚生娃了,然后时间不够用(确实是 ...

  7. ComponentPattern (组合模式)

    import java.util.LinkedList; /** * 组合模式 * * @author TMAC-J 主要用于树状结构,用于部分和整体区别无区别的场景 想象一下,假设有一批连锁的理发店 ...

  8. Android之SharedPreferences数据存储

    一.SharedPreferences保存数据介绍 如果有想要保存的相对较小键值集合,应使用SharedPreferences API.SharedPreferences对象指向包含键值对的文件并提供 ...

  9. 排序算法----调用库函数qsort进行快速排序

    功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...

  10. .NET跨平台之旅:数据库连接字符串写法引发的问题

    最近在一个ASP.NET Core站点中遇到一个奇怪问题.当用dotnet run命令启动站点后,开始的一段时间请求执行速度超慢,有时要超过20秒,有时甚至超过1分钟,日志中会记录这样的错误: Sys ...