思路
根据先序遍历可知当前的根节点,在中序遍历的数组中找到范围内与根节点相同的节点,根据后序遍历dfs即可
// al、ar表示先序遍历数组中的范围,bl、br表示中序编创数组的范围
void dfs (int al, int ar, int bl, int br)
至于范围如何确定嘛……
设在
b
b
b数组中,与
a
a
a数组当前根节点相同的数字,在位置
p
p
p,
对当前的左子树dfs
a
l
al
al为当前
a
l
+
1
al + 1
al+1,位于左子树的数字,都在
a
a
a数组的
a
l
+
p
−
b
l
al+p-bl
al+p−bl范围内,就是
a
r
ar
ar的值
b
l
bl
bl的值就为
b
l
bl
bl,
b
r
br
br则为
p
−
1
p-1
p−1
对当前的右子树dfs
a
l
al
al为左子树的
a
r
+
1
ar+1
ar+1,
a
r
ar
ar就等于
a
r
ar
ar
栗子
8
1 2 4 5 7 3 6 8
4 2 7 5 1 8 6 3
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], b[N];
void dfs (int al, int ar, int bl, int br) {
if (al == ar) {
printf ("%d ", a[al]);
return;
}
if (al > ar) return;
int p = bl;
while (a[al] != b[p]) p ++;
dfs(al + 1, al + p - bl, bl, p - 1);
dfs(al + p - bl + 1, ar, p + 1, br);
printf ("%d ", a[al]);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i ++) {
scanf ("%d", &a[i]);
}
for (int i = 0; i < n; i ++) {
scanf ("%d", &b[i]);
}
dfs (0, n - 1, 0, n - 1);
return 0;
}