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 ) N (≤ 20) N(≤20) which is the total number of nodes in the syntax tree. Then N N N lines follow, each gives the information of a node (the i i i-th line corresponds to the i i 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
−1
−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)%))+)
Solution:
// Talk is cheap, show me the code
// Created by Misdirection 2021-09-09 13:55:03
// All rights reserved.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
struct Node{
string data;
int leftPos, rightPos;
Node(string d, int l, int r){
data = d;
leftPos = l;
rightPos = r;
}
~Node(){}
};
vector<Node> tree;
string ans = "";
void postTraverse(int idx){
if(tree[idx].leftPos == -1 && tree[idx].rightPos == -1){
ans += tree[idx].data;
return;
}
if(tree[idx].leftPos != -1 && tree[idx].rightPos != -1){
ans += "(";
postTraverse(tree[idx].leftPos);
ans += ")";
ans += "(";
postTraverse(tree[idx].rightPos);
ans += ")";
ans += tree[idx].data;
return;
}
if(tree[idx].leftPos == -1 && tree[idx].rightPos != -1){
ans += tree[idx].data;
ans += "(";
postTraverse(tree[idx].rightPos);
ans += ")";
return;
}
}
int main(){
int n;
scanf("%d", &n);
tree.emplace_back("", -1, -1);
unordered_map<int, bool> flag;
for(int i = 0; i < n; ++i){
string data;
int left, right;
cin >> data;
scanf("%d %d", &left, &right);
tree.emplace_back(data, left, right);
flag[left] = flag[right] = true;
}
int headPos;
for(int i = 1; i <= n; ++i){
if(!flag[i]){
headPos = i;
break;
}
}
ans = "(";
postTraverse(headPos);
ans += ")";
printf("%s\n", ans.c_str());
return 0;
}