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.
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<bits/stdc++.h>
using namespace std;
struct tree
{
string data;
int lchild, rchild;
}a[25];
int n;
bool visited[25] = {false};
int build_tree() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
cin >> a[i].data >> a[i].lchild >> a[i].rchild;
if(a[i].lchild != -1) visited[a[i].lchild] = true;
if(a[i].rchild != -1) visited[a[i].rchild] = true;
}
for(int i = 1; i <= n; i++) {
if(!visited[i]) return i;//返回根节点
}
}
void postorder(int node) {
if(node == -1) return;
if(a[node].lchild == -1 || a[node].rchild == -1) { //如果左子树或者右子树为空则先输出根节点
cout << "(" << a[node].data;
postorder(a[node].lchild);
postorder(a[node].rchild);
cout << ")";
} else {
cout << "(";
postorder(a[node].lchild);
postorder(a[node].rchild);
cout << a[node].data << ")";
}
}
int main() {
int root = build_tree();
postorder(root);
return 0;
}