目录
题目
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 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)%))+)
注意点
- 当遇到一个没有左孩子,只有右孩子的结点时,对于该节点的访问要从后序遍历更改为类似于中序遍历的遍历方式
- 测试点4考察的是,符合上面第一点的结点不一定全是减号,也可以是其他符号,所以在分类讨论时不需要加上这类型的结点是减号的条件
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 结点结构体
struct Node{
string data;
int left,right;
};
// 存放结点的容器
vector<Node> tree;
int isChildren[21];
// 后序遍历
void postOrder(int nodeIndex){
if(nodeIndex==-1) return;
// 遇到没有左孩子时(相当于中序)
if(tree[nodeIndex].left==-1){
cout<<"("<<tree[nodeIndex].data;
postOrder(tree[nodeIndex].right);
cout<<")";
return;
}
cout<<"(";
postOrder(tree[nodeIndex].left);
postOrder(tree[nodeIndex].right);
cout<<tree[nodeIndex].data<<")";
}
int main(int argc, char** argv) {
int n;// 结点数量
cin>>n;
// 输入结点
tree.resize(n+1);
fill(isChildren+1,isChildren+1+n,0);
for(int i=1;i<=n;i++){
Node node;
cin>>node.data>>node.left>>node.right;
tree[i]=node;
// 记录是孩子的结点
isChildren[node.left]=1;
isChildren[node.right]=1;
}
// 寻找树的根节点
int root=-1;
for(int i=1;i<=n;i++){
if(isChildren[i]==0){
root=i;
break;
}
}
// 对这个树进行后续遍历
postOrder(root);
return 0;
}