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