PAT [un jour] 1086 Arbre Traversées Encore une fois

Une inorder traversée de l'arbre binaire peut être mis en œuvre d'une manière non récursif avec une pile. Par exemple, supposons que, quand un arbre binaire 6-noeud (avec les touches numérotées de 1 à 6) est traversée, les opérations d'empilement sont les suivantes: pression (1); poussoir (2); poussoir (3); pop(); pop(); poussoir (4); pop(); pop(); poussoir (5); poussoir (6); pop(); pop(). Ensuite, un arbre binaire unique (représenté sur la figure 1) peut être généré à partir de cette séquence d'opérations. Votre tâche est de donner la séquence traversal postorder de cet arbre.

Figure 1

Spécification d'entrée:

Chaque fichier d'entrée contient un cas de test. Pour chaque cas, la première ligne contient un nombre entier positif N (≤30) qui est le nombre total de noeuds dans un arbre (et donc les noeuds sont numérotés de 1 à N). Puis 2N lignes suivent, chacun décrit une opération de pile sous la forme: « Push X » où X est l'indice du noeud étant poussé sur la pile; ou « Pop », qui signifie à la pop un nœud de la pile.

Spécification de sortie:

Pour chaque cas d'essai, imprimer la séquence de traversée de postfixe de l'arbre correspondant à une ligne. Une solution est garantie d'exister. Tous les numéros doivent être séparés par exactement un espace, et il doit y avoir aucun espace supplémentaire à la fin de la ligne.

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

Je suppose que tu aimes

Origine www.cnblogs.com/xinyuLee404/p/12626912.html
conseillé
Classement