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(甲级)2017年秋季考试

PAT(甲级)2021年秋季考试summary

PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version

PAT(甲级)2019年春季考试 7-3 Telefraud Detection

PAT(甲级)2020年秋季考试 7-4 Professional Ability Test