给出输入序列,得到后序遍历的输出结果
输入
6 //总个数
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop
输出:
3 4 2 6 5 1
根据push 和pop可以构造树,也可以直接确定前序遍历和中序遍历的结果,就是已知这两个遍历得到后序遍历的结果
pop一次说明其没有左子树了,从中序遍历就可以进入了 再pop一次说明其无子树,则其父节点将成为下一个中序遍历的值
#include<stdio.h>
#include<string.h>
int gloab=-1;
//根据前序中序后序的特点
void printpost(int pre[],int inorder[],int len,int post[]) //len=top+1
{
int i;
if(len<=0)
return;
//反向存入,输出的时候反着输就行
post[++gloab]=pre[0];
for(i=0;i<len;i++)
if(inorder[i]==pre[0])
break;
//右子树
printpost(pre+i+1,inorder+i+1,len-i-1,post);
//左子树
printpost(pre+1,inorder,i,post);
}
int main()
{
int num,i,temp,top1=-1,top2=-1,top=-1,top3=-1;
char p[5];
int instack[30],prestack[30],tempstack[30],postsatck[30];
scanf("%d\n",&num);
for(i=0;i<2*num;i++)
{
scanf("%s",p); //scanf%s不用管换行
if(strcmp(p,"Push")==0)
{
scanf("%d\n",&temp);
prestack[++top1]=temp; //前序遍历的结果
tempstack[++top]=temp;
}
if(strcmp(p,"Pop")==0)
{
instack[++top2]=tempstack[top--]; //产生中序遍历的结果
}
}
for(i=gloab;i>0;i--)
printf("%d ",postsatck[i]);
printf("%d",postsatck[i]);
return 0;
}