PAT(甲级)2019年秋季考试 7-3 Postfix Expression
Posted CSU迦叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT(甲级)2019年秋季考试 7-3 Postfix Expression相关的知识,希望对你有一定的参考价值。
只在编译原理学过一点后序表达式,我把这题当作普通的二叉树遍历,事实上也的确如此。我注意到“-”这个符号不一样,别的都是后序遍历,但是遇到这个负号/减号就变成了先序。
于是我对负号做特判,遇到值为负号就改后序为先序,但是有一个测试用例通不过,换成中序也不行,看了别人的代码才知道是当只有一个子树时,改为先序遍历,但是我还不知道这么做的原因。
另外看到输出里面有那么多的括号我真头疼,原来是在遍历函数的头尾(当然不把return包含)加上分别输出左右括号即可。
AC代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cstring>
using namespace std;
const int maxn = 21;
const int SUP = 100010;//权重小于等于100
struct Node{
string s;
int l,r;
Node(string _s,int _l,int _r):s(_s),l(_l),r(_r){}
};
bool appear[21] = {0};
vector<Node> tree;
void travel(int root){
if(root==-1)return;
cout<<"(";
if(tree[root].l==-1||tree[root].r==-1){
cout<<tree[root].s;
if(tree[root].l!=-1)travel(tree[root].l);
if(tree[root].r!=-1)travel(tree[root].r);
}else{//后序遍历
if(tree[root].l!=-1)travel(tree[root].l);
if(tree[root].r!=-1)travel(tree[root].r);
cout<<tree[root].s;
}
cout<<")";
}
int main(){
int n;
scanf("%d",&n);
Node node = Node("anything",-1,-1);
tree.push_back(node);
string s;
int l,r;
for(int i=1;i<=n;i++){
cin>>s>>l>>r;
appear[l] = appear[r] = 1;
node = Node(s,l,r);
tree.push_back(node);
}
int root;
for(int i=1;i<=n;i++){
if(appear[i]==0){
root = i;
break;
}
}
travel(root);
return 0;
}
以上是关于PAT(甲级)2019年秋季考试 7-3 Postfix Expression的主要内容,如果未能解决你的问题,请参考以下文章
PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists
PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version