题解
怎么确定是否有唯一的树, 其实就是看除了叶子以外的每个节点是否都有两个儿子, 因为有一个儿子的话,它既可以是左儿子也可以是右儿子。
当不唯一时,全部当右儿子看待。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> pre, in, post;
bool unique = true;
void getin(int prel, int prer, int postl, int postr) {
if(prel == prer) {
in.push_back(pre[prel]);
return;
}
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 - prel - 1 - 1);
else unique = false;
in.push_back(pre[prel]);
getin(i, prer, postl + i - prel - 1, postr - 1);
}
int n;
int main() {
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);
printf("%s\n", unique ? "Yes" : "No");
for(int i = 0; i < n; ++i) printf("%d%c", in[i], i == n - 1 ? '\n' : ' ');
return 0;
}