原题链接:Postfix Expression (25 分)
类似题目:PAT 1130 Infix Expression
关键词:建树、DFS
整理时间:2020.7.24
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.
![]() | ![]() |
---|---|
Figure 1 | Figure 1 |
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)%))+)
题目大意: 给出中缀表达式的语法树,请你将后缀表达书其输出,括号体现优先级,操作符不可用括号包含。
思路: 树中的结点可以分为三类(因为是算法树,不会出现左孩子非空右孩子为空的情况):
- 左右孩子都为空:
输出结点值
- 左孩子为空,右孩子非空:
输出结点值+遍历右孩子
- 左右还在都非空:
遍历左孩子+遍历右孩子+输出结点值
代码:
#include<iostream>
#include<vector>
using namespace std;
struct node{
string data;
int l,r; //左右孩子的编号
};
vector<node> v; //结点数组
string f(int x){
if(v[x].l==-1 && v[x].r==-1){ //左右孩子都为空
return "("+v[x].data+")";
}
if(v[x].l==-1 && v[x].r!=-1){ //左孩子为空右孩子非空
return "("+v[x].data+f(v[x].r)+")";
}
return "("+f(v[x].l)+f(v[x].r)+v[x].data+")"; //左右都非空
}
int main(){
int n; //结点数
scanf("%d\n",&n);
v.resize(n+1);
vector<int> a(n+1); //用于找到根,非根结点标记为1
a.clear();
for(int i = 1; i <= n; i++){
cin >> v[i].data >> v[i].l >> v[i].r;
if(v[i].l!=-1) a[v[i].l]=1;
if(v[i].r!=-1) a[v[i].r]=1;
}
for(int i = 1; i <= n; i++){
if(a[i] == 0){
cout << f(i);
break;
}
}
return 0;
}