PAT [un día] 1086 Árbol Recorridos De nuevo

Un recorrido de árbol binario finde se puede implementar de una manera no recursiva con una pila. Por ejemplo, supongamos que cuando se atraviesa un árbol binario 6-nodo (con las teclas numeradas del 1 al 6), las operaciones de la pila son: push (1); de empuje (2); de empuje (3); popular(); popular(); de empuje (4); popular(); popular(); de empuje (5); de empuje (6); popular(); popular(). A continuación, un árbol binario único (que se muestra en la Figura 1) se puede generar a partir de esta secuencia de operaciones. Su tarea es dar a la secuencia de orden posterior recorrido de este árbol.

Figura 1

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 están numerados de 1 a N). Entonces 2N líneas siguen, cada una describe una operación de la pila en el formato: "Push X", donde X es el índice de nodo que se inserta en la pila; o "pop", que significa hacer estallar un nodo de la pila.

Especificación de la salida:

Para cada caso de prueba, imprimir la secuencia postorden recorrido del árbol correspondiente en una línea. Una solución está garantizada de existir. Todos los números deben estar separados por un espacio exactamente, y no debe haber ningún espacio extra al final de la línea.

#include <cstdio>
#include <cstring>
#include <stack>
//已知树的前序和中序,输出树的后序
using namespace std;
struct node{
    int data;
    node* lchild;
    node* rchild;
};
int pre[35] , in[35] ;//先序,中序
int N;//节点个数
stack<int> nums;
//建树
node* creat(int preL, int preR, int inL, int inR)
{
    if(preL > preR) return nullptr;
    node* root = new node;
    root->data = pre[preL];
    int k;
    for (k = inL; k <= inR; k++)
    {
        if(in[k] == pre[preL]) break;
    }
    int numLeft = k - inL;
    root->lchild = creat(preL + 1, preL + numLeft,inL, k-1);
    root->rchild = creat(preL + numLeft + 1, preR, k +1, inR);
    return root;
}
//后序输出
int flag = 0;
void postorder(node* root)
{

    if(root == nullptr) return;
    postorder(root->lchild);
    postorder(root->rchild);
    printf("%d", root->data);
    flag++;
    if(flag < N)printf(" ");
}

int main()
{
    char str[10];
    int num, k = 0,n = 0;
    scanf("%d", &N);
    for (int i = 0; i<2*N; ++i)
    {
        scanf("%s",&str);
        if(!strcmp(str, "Push"))
        {
            scanf("%d",&num);
            nums.push(num);
            pre[k] = num;
            k++;
        } else
        {
            in[n] = nums.top();
            nums.pop();
            n++;
        }
    }
    node* root = creat(0, N-1, 0,N-1);
    postorder(root);
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/xinyuLee404/p/12626912.html
Recomendado
Clasificación