对于如题给出的语法树,每个结点只有三种情况:
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;
}