PAT A 2019年秋季 7-3 Postfix Expression AC代码

对于如题给出的语法树,每个结点只有三种情况:

1、左子不空,右子不空

2、左子空,右子不空

3、左子空,右子空

根据题意,对应的输出应为

1、( 左子树内容 右子树内容 当前结点内容 )

2、(当前结点内容 右子树内容 )

3、(当前结点内容)

按照这个去递归语法树即可

tips:我一开始根据表达式可能的情况,对加乘除以及减四个符号分开专门判断,最后一个测试点没法通过。说不定最后一个测试点的符号不一定是题中给出的符号样式或者输出是一个不合法的后缀表达式。(个人猜测) 所以抓住语法树的结构来进行后缀转换是万无一失的。

#include<iostream>
using namespace std;
int N,root;
struct node{
	string data;
	int lc,rc;
}Node[21];
string postfix(int index){
	if(index==-1) return "";
	string x=Node[index].data;
	if(Node[index].lc==-1&&Node[index].rc!=-1){
		return "("+x+postfix(Node[index].rc)+")";
	}else if(Node[index].lc!=-1&&Node[index].rc!=-1){
		return "("+postfix(Node[index].lc)+postfix(Node[index].rc)+x+")";
	}else{
		return "("+x+")";
	}
}
int main(){
	cin>>N;
	int tag[N+1]={0};
	for(int i=1;i<=N;i++){
		cin>>Node[i].data>>Node[i].lc>>Node[i].rc;
		if(Node[i].lc!=-1){
			tag[Node[i].lc]++;
		}
		if(Node[i].rc!=-1){
			tag[Node[i].rc]++;
		}
	}
	for(int i=1;i<=N;i++){
		if(tag[i]==0) root=i;
	}
	cout<<postfix(root)<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值