先说结论,树里面有只有一个孩子的节点,那么这个二叉树就不能由先序遍历和后序遍历唯一确定,这道题不能用map映射做,因为如果递归到一个叶子节点的时候,prel+1这个元素是不存在的,同样在后序遍历序列里面也没有,所以不能用map去找,用朴素方法循环去找,
然后是本题的输出,最后要输出一个换行,不然会有格式错误,这是一个很不专业的地方,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define sz(x) ((int) x.size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int N = 35;
struct node {
int val, lchild, rchild;
} tree[N];
int ok, tot, check;
int pre[N], post[N];
int create(int prel, int prer, int postl, int postr) {
if (prel > prer) return -1;
int root = tot++; tree[root].val = pre[prel];
int k, numleft = 0;
for (k = postl; k < postr; k++) {
numleft++;
if (post[k] == pre[prel + 1]) break;
}
if (k == postr - 1) ok = 1;
tree[root].lchild = create(prel + 1, prel + numleft, postl, k);
tree[root].rchild = create(prel + numleft + 1, prer, k + 1, postr - 1);
return root;
}
void inorder(int root) {
if (root == -1) return;
inorder(tree[root].lchild);
cout << (check++ ? " " : "") << tree[root].val;
inorder(tree[root].rchild);
}
int main() {
int n; cin >> n;
for (int i = 0; i < n; i++) cin >> pre[i];
for (int i = 0; i < n; i++) cin >> post[i];
int root = create(0, n - 1, 0, n - 1);
cout << (ok ? "No" : "Yes") << endl;
inorder(root); cout << endl;
return 0;
}