UVA - 122 Trees on the level Map

题目大意:给出一些字符串表示二叉树,字符串的格式如下(n,s),n表示节点上的数,s表示该节点在哪个位置,问这些字符串能否组成二叉树

解题思路:能否组成二叉树,首先需要判断根节点。

接着判断一下其他节点,按层次遍历的顺序来枚举,所以要先排序,按字符串的长度来排序。

如果该节点能是二叉树的节点,那么他的父节点就要存在

判断他的父节点是否存在,只需判断他的前len-1(len表示长度)个字符组成的串是否存在

这题注意要判重

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
#define maxn 266

struct Node{
    int num, len;
    char str[maxn];
}N[maxn];
int ans[maxn], cnt;

bool solve() {
    int count = 0, M = 1, start = 0;
    map<string,int> Map;
    if(N[0].len != 1) {
        return false;
    }
    else {
        ans[count++] = N[0].num;
        start = 1;
    }

    for(int i = start; i < cnt; i++) {
        if(N[i].len == 1)
            return false;
        string t;
        if(N[i].len == 2) {
            string t;
            t += N[i].str[0];
            if(Map[t])
                return false;
            Map[t] = M++;
            ans[count++] = N[i].num;
            continue;
        }
        for(int j = 0; j < N[i].len - 2; j++)
            t += N[i].str[j];
        if(Map[t])
            ans[count++] = N[i].num;
        else
            return false;
        t += N[i].str[N[i].len - 2];
        if(Map[t])
            return false;
        Map[t] = M++;
    }
    return true;
}

bool cmp(const Node a, const Node b) {
    if(a.len == b.len)
        return strcmp(b.str,a.str) > 0;
    else
        return a.len < b.len;
}

int main() {
    char str[maxn];
    while(scanf("%s", str) != EOF) {
        cnt = 0;
        if(strcmp(str,"()") == 0)
            break;
        sscanf(str,"(%d,%s)", &N[cnt].num,N[cnt].str);
        N[cnt].len = strlen(N[cnt].str);
        cnt++;
        while(scanf("%s", str) != EOF) {
            if(strcmp(str,"()") == 0)
                break;
            sscanf(str,"(%d,%s)", &N[cnt].num, N[cnt].str);
            N[cnt].len = strlen(N[cnt].str);
            cnt++;
        }
        sort(N, N + cnt, cmp);
        if(solve()) {
            printf("%d", ans[0]);
            for(int i = 1; i < cnt; i++)
                printf(" %d", ans[i]);
        }
        else
            printf("not complete");
        printf("\n");
    }
    return 0;
}
时间: 2024-10-14 22:31:58

UVA - 122 Trees on the level Map的相关文章

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

 Trees on the level UVA - 122  解题思路: 首先要解决读数据问题,根据题意,当输入为"()"时,结束该组数据读入,当没有字符串时,整个输入结束.因此可以专门编写一个readin()函数,类型设置为bool型,遇到第一种情况时返回true,遇到第二种情况返回false,主程序中只要发现readin返回false时就break,结束整个大循环. 接下来要建立二叉树,首先为二叉树编写一个结构体,然后根据字符串的输入情况来建树,如果是'L'就往左走,走不动时建一颗

UVa 122 Trees on the level(建树,层次遍历)

题意  建树并层次遍历输出  (data,pos)  pos表示改节点位置  L代表左儿子  R代表右儿子 建树很简单  开始在根节点  遇到L往左走遇到R往右走 节点不存在就新建   走完了就保存改节点的值  输出直接bfs就行了了 #include<cstdio> #include<cctype> #include<cstring> using namespace std; const int maxn = 300; char s[maxn][maxn]; int

uva 122 trees on the level——yhx

题目如下:Given a sequence of binary trees, you are to write a program that prints a level-order traversal of each tree. In this problem each node of a binary tree contains a positive integer and all binary trees have have fewer than 256 nodes. In a level

UVA 122 Trees on the level 二叉树 广搜

题目链接: https://vjudge.net/problem/UVA-122 题目描述: 给你一种二叉树的构造方法, 让你逐层输出二叉树的节点值, 如果不能够则输出"not complete" 解题思路: 这道题就是硬搞就可以了, 参考紫书去做的, 首先处理输入就是非常麻烦的事情, 用到了sscanf就会轻松很多, 看来C中还是有很多很多的好用的标准库函数可以拿来用的, 例如还有本题中的strchr() , 处理完输入, 然后就去构造数. 然后广搜一遍即可 代码: #include

UVa 122 Trees on the level

题意:给出一棵二叉树,按照从上到下,从左到右输出所有节点的值,如果有一个节点没有赋值或者被多次赋值则输出not complete 看的紫书照着敲的= = 先要将输入进来的值建成一颗二叉树(定义一个二叉树的节点,新建节点的函数,添加节点的函数),再对建好的二叉树遍历(BFS) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<

uva 122 - Trees on the level(一棵看着书都写不利索的树……)

#include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<queue> #include<algorithm> using namespace std; const int maxn = 1000; char s[maxn]; bool failed; vector<int > ans; struct node { boo

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

题意  :输入一棵二叉树,你的任务是按从上到下.从左到右的顺序输出各个结点的值.每个结 点都按照从根结点到它的移动序列给出(L表示左,R表示右).在输入中,每个结点的左 括号和右括号之间没有空格,相邻结点之间用一个空格隔开.每棵树的输入用一对空括 号"()"结束(这对括号本身不代表一个结点),注意,如果从根到某个叶结点的路径上有的结点没有在输入中给出,或者给出超过一 次,应当输出not complete.结点个数不超过256. 分析  : 如果使用数组建树的话,256个结点看着不多,但

122 - Trees on the level(动态分配空间解法)

Trees on the level Background Trees are fundamental in many branches of computer science. Current state-of-the art parallel computers such as Thinking Machines' CM-5 are based on fat trees. Quad- and octal-trees are fundamental to many algorithms in

UVa122:Trees on the level

Trees on the level Background Trees are fundamental in many branches of computer science. Current state-of-the art parallel computers such as Thinking Machines' CM-5 are based on fat trees. Quad- and octal-trees are fundamental to many algorithms in