PTA-L2-006 Árbol transversal (25 puntos)
Dado el recorrido posterior al pedido y el recorrido en orden, dado el recorrido del nivel.
Sabemos que recorrido posterior al orden: raíz izquierda y derecha
recorrido en orden: raíz izquierda derecha
Entonces, el último del recorrido posterior al orden es el nodo raíz, y luego encontramos este nodo raíz en el recorrido en orden, distinguimos el subárbol izquierdo del subárbol derecho y luego recursimos.
En el proceso recursivo lo construimos.
salida final
La salida bfs es suficiente.
parte del código:
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e3 + 10;
const int M = 55;
const int INF = 1e6 + 10;
typedef long long ll;
struct node
{
int l;
int r;
}f[N];
int mid[N];
int post[N];
int n;
int dfs(int midl, int midr, int posl, int posr)
{
if (midl > midr)
{
return 0;
}
int root = post[posr];
int fa = midl;
while (root != mid[fa])
{
fa++;
}
int len = fa - midl;
f[root].l = dfs(midl, fa - 1, posl, posl + len - 1);
f[root].r = dfs(fa + 1, midr, posl + len, posr - 1);
return root;
}
void bfs(int root)
{
int a[N];
int cnt = 0;
queue<int> q;
q.push(root);
while (!q.empty())
{
int t = q.front();
q.pop();
if (t)
{
a[cnt++] = t;
}
if (f[t].l)
{
q.push(f[t].l);
}
if (f[t].r)
{
q.push(f[t].r);
}
}
for (int i = 0; i < cnt; i++)
{
if (i)
{
cout << " ";
}
cout << a[i];
}
cout << endl;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> post[i];
}
for (int i = 0; i < n; i++)
{
cin >> mid[i];
}
int root = post[n - 1];
dfs(0, n - 1, 0, n - 1);
bfs(root);
return 0;
}