PAT (Top Level) Practise 1006 Tree Traversals - Hard Version (35)
来源:互联网 发布:淘宝账号和密码全忘记 编辑:程序博客网 时间:2024/06/14 17:10
1006. Tree Traversals - Hard Version (35)
Given the partial results of a binary tree's traversals in in-order, pre-order, and post-order. You are supposed to output the complete results and the level order traversal sequence of the corresponding tree.
Input Specification:
Each input file contains one test case. For each case, a positive integer N (<=100) is given in the first line. Then three lines follow, containing the incomplete in-order, pre-order and post-order traversal sequences, respectively. It is assumed that the tree nodes are numbered from 1 to N and no number is given out of the range. A "-" represents a missing number.
Output Specification:
For each case, print in four lines the complete in-order, pre-order and post-order traversal sequences, together with the level order traversal sequence of the corresponding tree. The numbers must be separated by a space, and there must be no extra space at the end of each line. If it is impossible to reconstruct the unique tree from the given information, simply print "Impossible".
Sample Input 1:93 - 2 1 7 9 - 4 69 - 5 3 2 1 - 6 43 1 - - 7 - 6 8 -Sample Output 1:
3 5 2 1 7 9 8 4 69 7 5 3 2 1 8 6 43 1 2 5 7 4 6 8 99 7 8 5 6 3 2 4 1Sample Input 2:
3- - -- 1 -1 - -Sample Output 2:
Impossible
此题给出的是一棵二叉树的三种遍历,然后挖了空要求还原,并且输出bfs的结果。
简单的说就是考虑暴力的递归求解即可,然后注意边界,顺便加一点剪枝就好了。
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<vector>#include<map>#include<iostream>#include<stack>#include<algorithm>#include<bitset>#include<functional>#include<ctime>using namespace std;typedef unsigned long long ull;typedef long long LL;const int maxn = 1e2 + 10;const int INF = 0x7FFFFFFF;int n, ch[maxn][2], root = 0, f[maxn], cnt, flag, res;int a[maxn], b[maxn], c[maxn], fa[maxn], fb[maxn], fc[maxn], t[maxn];char s[5];int get(){ scanf("%s", s); if (s[0] == '-') return 0; int res = 0; for (int i = 0; s[i]; i++) res = res * 10 + s[i] - '0'; return res;}bool dfs(int &x, int al, int ar, int bl, int br, int cl, int cr){ if (al > ar) { x = 0; return true; } for (int i = al; i <= ar; i++) { if (a[i] && b[bl] && a[i] != b[bl]) continue; if (a[i] && c[cr] && a[i] != c[cr]) continue; if (c[cr] && b[bl] && c[cr] != b[bl]) continue; t[i] = max(a[i], max(b[bl], c[cr])); if (fa[t[i]] && fa[t[i]] != i) continue; if (fb[t[i]] && fb[t[i]] != bl) continue; if (fc[t[i]] && fc[t[i]] != cr) continue; x = i; if (!dfs(ch[x][0], al, i - 1, bl + 1, bl + i - al, cl, cl + i - al - 1)) continue; if (!dfs(ch[x][1], i + 1, ar, bl + 1 + i - al, br, cl + i - al, cr - 1)) continue; return true; } return false;}void dfs(int x, int y){ if (!x) return; if (y == 2) { printf("%s%d", flag ? " " : "", t[x]); flag = 1; } dfs(ch[x][0], y); if (y == 1) { printf("%s%d", flag ? " " : "", t[x]); flag = 1; } dfs(ch[x][1], y); if (y == 3) { printf("%s%d", flag ? " " : "", t[x]); flag = 1; }}void bfs(int x){ queue<int> p; p.push(x); while (!p.empty()) { int q = p.front(); p.pop(); printf("%s%d", flag ? " " : "", t[q]); flag = 1; if (ch[q][0]) p.push(ch[q][0]); if (ch[q][1]) p.push(ch[q][1]); }}int main(){ scanf("%d", &n); for (int i = 1; i <= n; i++) a[i] = get(), f[a[i]]++, fa[a[i]] = i; for (int i = 1; i <= n; i++) b[i] = get(), f[b[i]]++, fb[b[i]] = i; for (int i = 1; i <= n; i++) c[i] = get(), f[c[i]]++, fc[c[i]] = i; for (int i = 1; i <= n; i++) if (!f[i]){ cnt++; res = i; } if (cnt > 1 || !dfs(root, 1, n, 1, n, 1, n)) printf("Impossible\n"); else { for (int i = 1; i <= n; i++) if (!t[i]) t[i] = res; flag = 0; dfs(root, 1); putchar(10); flag = 0; dfs(root, 2); putchar(10); flag = 0; dfs(root, 3); putchar(10); flag = 0; bfs(root); putchar(10); } return 0;}
- PAT (Top Level) Practise 1006 Tree Traversals - Hard Version (35)
- PAT (Top Level) Practise 1001Battle Over Cities - Hard Version (35)
- PAT (Top Level) Practise 1004To Buy or Not to Buy - Hard Version (35)
- PAT (Top Level) Practise 1007 Red-black Tree (35)
- 1020. Tree Traversals (25) @ PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1020. Tree Traversals (25)
- 浙大PAT (Advanced Level) Practise 1020Tree Traversals (25)
- 1020. Tree Traversals (25)——PAT (Advanced Level) Practise
- PAT (Advanced Level) Practise 1020 Tree Traversals (25)
- PAT (Advanced Level) Practise 1086 Tree Traversals Again (25)
- PAT (Advanced Level) Practise 1020. Tree Traversals (25)
- PAT (Advanced Level) Practise 1086 Tree Traversals Again (25)
- PAT (Advanced Level) Practise 1020 Tree Traversals (25)
- 1006. Tree Traversals - Hard Version (35)
- PAT (Top Level) Practise 1002Business (35)
- PAT (Top Level) Practise 1018Subnumbers (35)
- pat-top 1006. Tree Traversals
- 1006. Tree Traversals - Hard Version (35)解题报告
- php使用explode分割字符串新手容易忽略的问题
- 通过汇编一个简单的C程序,分析汇编代码理解计算机工作原理
- Log4J日志配置详解
- 系统框架 springmvc mybatis Bootstrap html5 shiro maven
- WebStorm快捷键
- PAT (Top Level) Practise 1006 Tree Traversals - Hard Version (35)
- 单例模式的三种常用的形式
- Android: 解决动画完成后位置恢复到初始位置的问题
- struts2整合spring
- SQL分页排序的实现
- 安卓开发中文乱码
- SqlServer 表数据统计,相同属性的汇总到一列,并用逗号隔开
- PAT (Top Level) Practise 1007 Red-black Tree (35)
- JavaScipt学习中的高阶函数