UVA - 122 Trees on the level Map

来源:互联网 发布:java 文件名中文乱码 编辑:程序博客网 时间:2024/05/21 06:39

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

解题思路:能否组成二叉树,首先需要判断根节点。
接着判断一下其他节点,按层次遍历的顺序来枚举,所以要先排序,按字符串的长度来排序。
如果该节点能是二叉树的节点,那么他的父节点就要存在
判断他的父节点是否存在,只需判断他的前len-1(len表示长度)个字符组成的串是否存在
这题注意要判重

#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<string>using namespace std;#define maxn 266struct 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;}
0 0
原创粉丝点击