2019年9月8日秋季PAT甲级题解--3 Postfix Expression (25 分)

Given a syntax tree (binary), you are supposed to output the corresponding postfix expression, with parentheses reflecting the precedences of the operators.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤ 20) which is the total number of nodes in the syntax tree. Then N lines follow, each gives the information of a node (the i-th line corresponds to the i-th node) in the format:

data left_child right_child

where data is a string of no more than 10 characters, left_child and right_child are the indices of this node's left and right children, respectively. The nodes are indexed from 1 to N. The NULL link is represented by −1. The figures 1 and 2 correspond to the samples 1 and 2, respectively.

infix1.JPG infix2.JPG
Figure 1 Figure 2

Output Specification:

For each case, print in a line the postfix expression, with parentheses reflecting the precedences of the operators.There must be no space between any symbols.

Sample Input 1:

8
* 8 7
a -1 -1
* 4 1
+ 2 5
b -1 -1
d -1 -1
- -1 6
c -1 -1

Sample Output 1:

(((a)(b)+)((c)(-(d))*)*)

Sample Input 2:

8
2.35 -1 -1
* 6 1
- -1 4
% 7 8
+ 2 3
a -1 -1
str -1 -1
871 -1 -1

Sample Output 2:

(((a)(2.35)*)(-((str)(871)%))+)
//得分19,满分25
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
 
using namespace std;
 
struct node{
    int lchild,rchild;
    string data;
};
vector<node> v;
void dfs(int root){
    if(v[root].lchild==-1 && v[root].rchild==-1){
        cout<<"("<<v[root].data<<")";
        return;
    }
    cout<<"(";
    if(v[root].lchild!=-1)dfs(v[root].lchild);
    if(v[root].rchild!=-1 && v[root].data!="-")dfs(v[root].rchild);
    else if(v[root].rchild!=-1 && v[root].data=="-"){
        cout<<"-";
        dfs(v[root].rchild);
        cout<<")";
    }
    if(v[root].data!="-")cout<<v[root].data<<")";
}
 
int main(){
    int n;
    cin>>n;
    v.resize(n+1);
    string d;
    int l,r;
    vector<int> father(n+1);
    for(int i=1;i<=n;i++){
        cin>>d>>l>>r;
        v[i].data=d;
        v[i].lchild=l;
        v[i].rchild=r;
        if(l!=-1)father[l]=i;
        if(r!=-1)father[r]=i;
    }
    int j=1;
    while(father[j]!=0)j=father[j];
    dfs(j);
    return 0;
}
发布了21 篇原创文章 · 获赞 1 · 访问量 1195

猜你喜欢

转载自blog.csdn.net/allisonshing/article/details/100642958