[MOOC] 03-Tree 3 Tree Traversals Again (25 puntos)

Un recorrido de árbol binario en orden se puede implementar de una manera no recursiva con una pila. Por ejemplo, suponga que cuando se recorre un árbol binario de 6 nodos (con las claves numeradas del 1 al 6), las operaciones de la pila son: empujar (1); empujar (2); empujar (3); popular(); popular(); empujar (4); popular(); popular(); empujar (5); empujar (6); popular(); popular(). Luego, se puede generar un árbol binario único (que se muestra en la Figura 1) a partir de esta secuencia de operaciones. Su tarea es dar la secuencia transversal de postorder de este árbol.
Inserte la descripción de la imagen aquí

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene un número entero positivo N (≤30) que es el número total de nodos en un árbol (y por lo tanto, los nodos se numeran de 1 a N). Luego siguen 2N líneas, cada una describe una operación de pila en el formato: “Empujar X” donde X es el índice del nodo que se empuja a la pila; o "Pop" que significa sacar un nodo de la pila.

Especificación de salida:
Para cada caso de prueba, imprima la secuencia transversal posterior al orden del árbol correspondiente en una línea. Se garantiza que existe una solución. Todos los números deben estar separados exactamente por un espacio y no debe haber espacio adicional al final de la línea.

Entrada de muestra:

6
Empuje 1
Empuje 2
Empuje 3
Pop
Pop
Empuje 4
Pop
Pop
Empuje 5
Empuje 6
Pop
Pop

Salida de muestra:

3 4 2 6 5 1

A través de la observación, se puede encontrar que esta pregunta en realidad da el recorrido de orden previo y de orden medio del árbol binario, y luego genera el recorrido posterior al orden del árbol binario. La muestra de prueba no ha podido pasar, y más tarde se encontró que era ni-1, no n-i + 1, preste atención al cambio del subíndice cada vez que se repite.
Nota: bef significa antes (comienzo del preámbulo), mid significa in (comenzando en la secuencia del medio) y pot significa después (comienzo de la secuencia posterior). recorrido de preorden, recorrido en orden, recorrido posterior a pedido
#include <iostream> 
#include <stack> 
using namespace std;

int pre[35],in[35],post[35];

void order(int bef,int mid,int aft,int n){
    
    
	if(n<1)
		return;
	if(n==1)//递归终止条件
		post[aft] = pre[bef];
	else{
    
    
		int tmp = pre[bef];
		post[aft+n-1] = tmp;
		int i;
		for(i = 0;i<n;i++){
    
    
			if(in[mid+i]==tmp)
				break;
		}
		order(bef+1,mid,aft,i);
		order(bef+i+1,mid+i+1,aft+i,n-i-1);
	}
}

void print(int n){
    
    
	if(n<1)
		return;
	cout << post[0];
	for(int i = 1;i<n;i++)
		cout << " " << post[i];
}

int main(){
    
    
	int n,x,m;
	cin >> n;
	stack<int> s;
	int k = 0,p = 0;
	string op;
	//注意是2*n,因为n个结点的中序遍历对应2*n次出栈和入栈
	for(int i = 0;i<2*n;i++){
    
    
		cin >> op;
		if(op=="Push"){
    
    
			cin >> x;
			pre[k++] = x;
			s.push(x);
		}
		else if(op=="Pop"&&!s.empty()){
    
    
			m = s.top();
			s.pop();
			in[p++] = m;
		}
	}
	order(0,0,0,n);
	print(n);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45845039/article/details/108890446
Recomendado
Clasificación