PAT

发布时间:2024-11-12 01:11

最新推荐文章于 2022-02-09 11:29:00 发布

&再见萤火虫& 于 2020-03-10 12:51:17 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

目录

1,题目描述

题目大意

2,思路

3,AC代码

4,解题过程

第一搏

1,题目描述

implemented:使生效; 贯彻; 执行; 实施; 

Sample Input:

6

Push 1

Push 2

Push 3

Pop

Pop

Push 4

Pop

Pop

Push 5

Push 6

Pop

Pop

Sample Output:

3 4 2 6 5 1

题目大意

用栈的一些操作,模拟树的构建,并输出树的后序遍历。

2,思路

将入栈的序列,看作先序遍历;出栈的序列看作中序遍历;(根据例子中的图形得出的结论)根据树的遍历特点(先序遍历第一个节点为根节点,找到此节点在中序遍历中的位置,即可将树划分为左右两子树,具体可参考@&再见萤火虫&【PAT_甲级_1020 Tree Traversals (25分) (C++)【树的遍历】】)将根节点依次放入postOrder中(由于是将根节点逐个存入,故为了保证正确顺序,先遍历右子树,再遍历左子树,最后逆序输出);

对函数的补充说明

3,AC代码

#include<bits/stdc++.h>

using namespace std;

int N;

vector<int> inOrder, preOrder, postOrder;

void getPostOrder(int head, int tail, int root){

if(head > tail) return;

postOrder.push_back(preOrder[root]);

for(int i = head; i <= tail; i++){

if(inOrder[i] == preOrder[root]){

getPostOrder(i + 1, tail, root + i - head + 1);

getPostOrder(head, i - 1, root + 1);

return;

}

}

}

int main(){

#ifdef ONLINE_JUDGE

#else

freopen("1.txt", "r", stdin);

#endif

stack<int> sta;

string s;

cin>>N;

int num;

for(int i = 0; i < 2 * N; i++){

cin>>s;

if(s[1] == 'u'){

cin>>num;

sta.push(num);

preOrder.push_back(num);

}else{

num = sta.top();

sta.pop();

inOrder.push_back(num);

}

}

getPostOrder(0, N - 1, 0);

cout<<postOrder[N - 1];

for(int i = N - 2; i >= 0; i--)

cout<<' '<<postOrder[i];

return 0;

}

4,解题过程

第一搏

理解题意后(先序+中序=》后序),想起了上一次膜拜柳神的题目,和这个基本差不多(后序+中序=》先序=》层次遍历),传送门@&再见萤火虫&【PAT_甲级_1020 Tree Traversals (25分) (C++)【树的遍历】】

比那一题还要简单些。。。

一发入魂

网址:PAT https://www.yuejiaxmz.com/news/view/42364

相关内容

宠物如何饲养
八种享受生活每一天的简单方法
简单3招实现小宝贝安睡,妈妈不熬夜

随便看看