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)%))+)
代码如下:
#include<iostream>
using namespace std;
struct Node{
string value;
int left,right;
}node[21];
bool havefather[21];
void postOrder(int root)
{
if(root==-1)return;
//左儿子为空,只有右儿子,只有该符号为-的情况,其余符号都不可能;也不会是数字,没有运算符的情况下不能形成表达式
if(node[root].left==-1&&node[root].right!=-1){
cout<<"(";
cout<<node[root].value;
postOrder(node[root].right);
cout<<")";
}
else{
cout<<"(";
postOrder(node[root].left);
postOrder(node[root].right);
cout<<node[root].value;
cout<<")";
}
}
int main()
{
int n,root;
cin>>n;
for(int i=1;i<=n;i++)
cin>>node[i].value>>node[i].left>>node[i].right;
for(int i=1;i<=n;i++)
{
if(node[i].left!=-1)havefather[node[i].left]=true;
else havefather[node[i].left]=false;
if(node[i].right!=-1)havefather[node[i].right]=true;
else havefather[node[i].right]=false;
}
//找出根节点
for(int i=1;i<=n;i++){
if(!havefather[i]){
root=i;
break;
}
}
postOrder(root);
cout<<endl;
return 0;
}
运行结果如下: