题目链接:https://www.patest.cn/contests/pat-a-practise/1086
解题思路:
本题其实就是根据树的前序遍历序列和中序序列求后序序列。所给的输入是入栈出栈序列,此序列中,所有的入栈元素顺序构成的序列为树的前序遍历序列;所有的出栈元素顺序构成的序列为中序遍历序列。
代码中函数postorder(int rootidx,int startidx,int endidx),是根据前序序列和中序序列求后序序列的函数。其中rootidx是前序序列中当前子树根节点的下标,startidx和endidx分别是当前子树在中序序列中最左端和最右端的下标。
#include <iostream>
#include <stack>
#include <vector>
#include <cstring>
using namespace std;
vector<int> pre,in,post;
void postorder(int rootidx,int startidx,int endidx){//根据前序和中序序列求后序序列
if(startidx>endidx)
return;
int i=startidx;
while(i<endidx&&in[i]!=pre[rootidx]) i++;
postorder(rootidx+1,startidx,i-1);
postorder(rootidx+i-startidx+1,i+1,endidx);
post.push_back(pre[rootidx]);
}
int main(int argc, char const *argv[])
{
int N;
cin>>N;
stack<int> s;
char pp[5];
//先生成前序序列和中序序列
for(int i=0;i<2*N;i++){
cin>>pp;
if(strlen(pp)==4){//入栈顺序为前序序列
int num;
cin>>num;
s.push(num);
pre.push_back(num);
}
else{//出栈顺序为中序序列
in.push_back(s.top());
s.pop();
}
}
postorder(0,0,N-1);//生成后序序列
cout<<post[0];
for(int i=1;i<N;i++)
cout<<" "<<post[i];
return 0;
}
结果: