1086 Tree Traversals Again (25 分)
题意
给出二叉树的前序和中序遍历序列,求后序遍历序列。
思路
方法同1020 Tree Traversals (25 分)。
通过前序序列和中序序列构建二叉树。
前序序列第一个为根root,查找中序序列root的位置,可以得到左右子树结点的数量,递归建树。
输出后序序列,注意结尾没有空格。
后续遍历二叉树 :先左子树 再右子树,最后输出根节点。
代码
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string>
#include<queue>
using namespace std;
typedef struct node{
int data;
node *lchild,*rchild;
}node;
stack<int>st;
queue<int>q;
int pre[40],post[40],in[40];
node* creat(int lpre,int rpre,int lin,int rin)
{
// printf("@@@@@\n");
int temp;
if(lpre>rpre){
return NULL;
}
node *root;
root=new node;
root->data=pre[lpre];
for(int i=lin;i<=rin;i++){ //注意这里是小于等于
if(in[i]==pre[lpre]){
temp=i;
break;
}
}
int numl=temp-lin;
root->lchild=creat(lpre+1,lpre+numl,lin,temp-1);
root->rchild=creat(lpre+numl+1,rpre,temp+1,rin);
return root;
}
void treepost(node* root)
{
if(root!=NULL){
treepost(root->lchild);
treepost(root->rchild);
q.push(root->data);
}
}
int main()
{
int n,pr=0,po=0,ins=0,y;
node *root;
char x[50];
scanf("%d",&n);
int m=n*2;
while(!st.empty()){
st.pop();
}
for(int i=0;i<m;i++){
scanf("%s",x);
if(x[1]=='o'){
in[ins++]=st.top();
st.pop();
}else{
scanf("%d",&y);
pre[pr++]=y;
st.push(y);
}
}
// for(int i=0;i<n;i++){
// printf("%d %d\n",pre[i],in[i]);
// }
// printf("$$$\n");
root=creat(0,n-1,0,n-1);
// printf("###\n");
treepost(root);
printf("%d",q.front());
q.pop();
while(!q.empty()){
printf(" %d",q.front());
q.pop();
}
return 0;
}