题目大意:给出一些字符串表示二叉树,字符串的格式如下(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