PTA-L2-006 Árbol transversal (25 puntos)

PTA-L2-006 Árbol transversal (25 puntos)

Portal

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;
} 

Supongo que te gusta

Origin blog.csdn.net/qq_44624316/article/details/110148167
Recomendado
Clasificación