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.
infix1.JPG infix2.JPG
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)+)(©(-(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;
bool isexist[30]={false},firstvis[30]={false};
struct node{
string data;
int left=-1,right=-1;
}lnode[30];
vector<char> v;
void dfs(int x){
if(lnode[x].left==-1||lnode[x].right==-1)
{
cout<<"(";
cout<<lnode[x].data;
if(lnode[x].right==-1)
cout<<")";
else{
firstvis[x]=true;
dfs(lnode[x].right);
}
if(firstvis[x]==true)
cout<<")";
return;
}
cout<<"(";
dfs(lnode[x].left);
dfs(lnode[x].right);
cout<<lnode[x].data<<")";
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>lnode[i].data>>lnode[i].left>>lnode[i].right;
if(lnode[i].left!=-1)
isexist[lnode[i].left]=true;
if(lnode[i].right!=-1)
isexist[lnode[i].right]=true;
}
int root;
for(int i=1;i<=n;i++){
if(isexist[i]==false)
{
root=i;
break;
}
}
dfs(root);
}