#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cctype>
#include<string>
#include<set>
#include<vector>
#include<unordered_map>
using namespace std;
vector<int> in, pre, post;
bool flag = true;
void getin(int prel, int prer, int postl, int postr) {
if (prel == prer) {
in.push_back(pre[prel]);
return;
}
if (pre[prel] == post[postr]) {
int i = prel + 1;//第一个右子树
while (i <= prer && pre[i] != post[postr - 1] ) i++;
if (i - prel > 1) {
getin(prel + 1, i - 1, postl, postl + (i - 1 - prel) - 1);
}
else {
flag = false;
}
in.push_back(pre[prel]);//中序放根
getin(i, prer, postl + (i - 1 - prel), postr - 1);
}
}
int main() {
int n; scanf("%d", &n);
pre.resize(n); post.resize(n);
for (int i = 0; i < n; ++i) scanf("%d", &pre[i]);
for (int i = 0; i < n; ++i) scanf("%d", &post[i]);
getin(0, n - 1, 0, n - 1);
if (flag) printf("Yes\n");
else printf("No\n");
for (int i = 0; i < in.size(); ++i) {
if (i != 0)printf(" ");
printf("%d", in[i]);
}
printf("\n");
return 0;
}
1119 Pre- and Post-order Traversals
最新推荐文章于 2024-10-05 21:10:28 发布