7-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.
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)+)(©(-(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 Node {
string data;
int l = -1, r = -1;
} node[25];
void PostTraversal(int root) {
if (root == -1) return;
printf("(");
if (node[root].l == -1 && node[root].r == -1) {
cout << node[root].data;
} else if (node[root].l == -1) {
cout << node[root].data;
PostTraversal(node[root].r);
} else {
PostTraversal(node[root].l);
PostTraversal(node[root].r);
cout << node[root].data;
}
printf(")");
}
int main() {
int N, visit[25] = {false}, root;
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
cin >> node[i].data >> node[i].l >> node[i].r;
if (node[i].l != -1) {
visit[node[i].l] = true;
}
if (node[i].r != -1) {
visit[node[i].r] = true;
}
}
for (int i = 1; i <= N; i++) {
if (visit[i] == false) {
root = i;
break;
}
}
PostTraversal(root);
return 0;
}