代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10, INF = 0x3f3f3f3f;
int las[N], mid[N];
int n;
struct node {
int val, l, r;
}tr[N];
int cnt;
void build (int u, int l, int r)
{
if (l == r)
{
tr[u].val = -1;
return ;
}
int k = las[cnt --];
tr[u] = {k, u * 2, u * 2 + 1};
int m = find (mid + 1, mid + 1 + n, k) - mid;
build (u * 2 + 1, m + 1, r);
build (u * 2, l, m);
}
int main ()
{
cin >> n;
for (int i = 1; i <= n; i ++) cin >> las[i];
for (int i = 1; i <= n; i ++) cin >> mid[i];
cnt = n;
build (1, 1, n + 1);
queue <int> q;
q.push (1);
int flag = 0;
while (q.size ())
{
auto t = q.front ();
q.pop ();
if (tr[t].val == -1) continue;
if (!flag) cout << tr[t].val;
else cout << " " << tr[t].val;
flag ++;
q.push (tr[t].l);
q.push (tr[t].r);
}
return 0;
}
先序+中序建树如下:
变化1:每次的k是取pre数组,后续+中序取的是las数组
变化2:建树的顺序,先序为中左右,后序为左右中
build (u * 2, l, mid);
build (u * 2 + 1, mid + 1, r);
void build (int u, int l, int r)
{
if (l == r)
{
tr[u].val = -1;
return ;
}
int k = pre[cnt ++];
tr[u] = {k, u * 2, u * 2 + 1};
int mid = find (midd + 1, midd + 1 + n, k) - midd;
//cout << "mid = " << mid << "\n";
build (u * 2, l, mid);
build (u * 2 + 1, mid + 1, r);
}