原题
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/42c680d24587a53ee7ac7c0fa3c2f174.png)
题目大意及思路
- 通过输入的语句来构建树,输出树的后序序列。
- 该题可通过push和pop语句分别找到先序、中序序列:先序序列即push语句输入的节点顺序;中序序列即pop语句pop出来的结点顺序;通过先序、中序得到后序序列。
代码
using namespace std;
vector<int> inorder,preorder;
int n,number=0;
void postorder(int root,int start,int end){
if(start>end) return;
int i=start;
while(i<end&&inorder[i]!=preorder[root]) i++;
postorder(root+1,start,i-1);
postorder(root+(i-start)+1,i+1,end);
number++;
printf("%d%s",preorder[root],number==n?"\n":" ");
}
int main(){
cin>>n;
stack<int> tree;
for(int i=0;i<2*n;i++){
string s;
cin>>s;
if(s=="Push"){
int index;
cin>>index;
tree.push(index);
preorder.push_back(index);
}
else if(s=="Pop"){
inorder.push_back(tree.top());
tree.pop();
}
}
postorder(0,0,n-1);
return 0;
}
运行截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/aa1db36dae8573e1c4062188c820fe31.png)
收获
- 一定要注意观察题目给的信息!比如说这个题就暗戳戳地提示你可以利用这个信息得出中序序列,但一般地,在求树的遍历序列时,我们都需要两种序列才能得到第三种序列,所以我们需要找出先序序列如何求:经过观察后,我发现了先序序列在这个题中的求的方法:push语句出现的结点的顺序。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1c6d666d03da66c637957c411dcd8b8b.png)