因为已经知道了每个点的路径,所以不需要建树,不需要广搜,直接以路径为关键字对节点进行排序。
排序之后就是答案了。如果树不合法,或者一条路出现多次,或者没有根节点,输出not complete。
/* HDU 1622 给出一颗二叉树,输出层次遍历的结果 层次遍历的顺序就是广搜的顺序 因此,先建树,再从根节点出发进行一次BFS 但由于题目已经给出了根节点到每个节点的路径 所以只需以路径为关键字对节点进行排序,排序之后的结果就是答案 如果树不合法,或者一条路出现多次,或者没有根节点,输出not complete */ #include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<map> #include<algorithm> using namespace std; struct Node { string a; string p; } s[300]; string tmp; int tot; //按这个规则对节点进行排序 bool cmp(const Node&a, const Node&b) { if (a.p.size() == b.p.size()) return a.p<b.p; return a.p.size()<b.p.size(); } //增加一个节点 void add() { string id; id.clear(); string path; path.clear(); for (int i = 0; i < tmp.size(); i++) if (tmp[i] >= '0'&&tmp[i] <= '9') id = id + tmp[i]; for (int i = 0; i<tmp.size(); i++) if (tmp[i] == 'L' || tmp[i] == 'R') path = path + tmp[i]; s[tot].a = id; s[tot].p = path; tot++; } int main() { int T = 0; while (cin >> tmp) { tot = 0; if (tmp == "()") break; add(); while (1) { cin >> tmp; if (tmp == "()") break; add(); } sort(s, s + tot, cmp); bool fail = 0; if (s[0].p.length()!=0) fail = 1;//如果第一个节点不是根节点,输出not complete //检查树是否合法 if (fail == 0) { for (int i = 1; i < tot; i++) { //判断到这个点的路径之前是否出现过 bool Find = 0; for (int k = 0; k < i; k++) if (s[k].p == s[i].p) Find = 1; if (Find == 1) { fail = 1; break; } //判断到这个点的路径是否存在 string pa = ""; for (int k = 0; k < s[i].p.size() - 1; k++) pa = pa + s[i].p[k]; Find = 0; for (int k = 0; k < i; k++) if (s[k].p == pa) Find = 1; if (Find == 0) {fail = 1; break;} } } //输出 if (fail == 0) { for (int i = 0; i<tot; i++) { cout << s[i].a; if (i<tot - 1) printf(" "); else printf("\n"); } } else printf("not complete\n"); } return 0; }