1020 Tree Traversals (25分)
分析
给出二叉树的后序遍历序列和中序遍历序列,可唯一确定二叉树,从而可输出层序遍历序列
代码
#include<iostream>
#include<queue>
using namespace std;
int n, post_odr[33], in_odr[33], level_odr[33], cnt = 0;
typedef pair<pair<int, int>, pair<int, int> > node;
void getlevel(node p) {
queue<node> q;
q.push(p);
while (!q.empty()) {
p = q.front();
q.pop();
level_odr[cnt++] = post_odr[p.first.second];
int i = p.second.first;
for (; i <= p.second.second; ++i)
if (in_odr[i] == post_odr[p.first.second])break;
if (i > p.second.first)q.push(pair<pair<int, int>, pair<int, int> >(pair<int, int>(p.first.first, p.first.first + i - 1 - p.second.first), pair<int, int>(p.second.first, i - 1)));
if (i < p.second.second)q.push(pair<pair<int, int>, pair<int, int> >(pair<int, int>(p.first.second + i - p.second.second, p.first.second - 1), pair<int, int>(i + 1, p.second.second)));
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i)scanf("%d", &post_odr[i]);
for (int i = 0; i < n; ++i)scanf("%d", &in_odr[i]);
node p = pair<pair<int, int>, pair<int, int> >(pair<int, int>(0, n - 1), pair<int, int>(0, n - 1));
getlevel(p);
for (int i = 0; i < n; ++i)printf("%d%s", level_odr[i], i == n - 1 ? "" : " ");
return 0;
}