题目描述:
给定一棵二叉树,二叉树的各个结点要么表示四则运算符+、-、*、/,要么表示一个不超过10的非负整数。将这棵二叉树看作中缀表达式树,输出对应的中缀表达式,以及该中缀表达式的计算结果。
注意,输出的中缀表达式中,除了最外层以外,内层的每个“左操作数 操作符 右操作数”形式的两侧都要加上一对小括号。例如2+(3*(4/5))就是一个可能的正确输出。
输入格式:
每个输入文件中一组数据。 第一行一个正整数N(N<=30),代表二叉树的结点个数(结点编号为0到N-1)。
第二行按结点编号从小到大的顺序给出N个结点的值(用空格隔开),其要么是四则运算符+、-、*、/的其中一个,要么是一个不超过10的非负整数。
接下来按结点编号从小到大的顺序给出N行,每行为两个编号,分别代表该结点的左孩子编号和右孩子编号,如果不存在左(右)孩子,那么就用字符'-'代替。数据保证编号在0到N-1之间,且中缀表达式树一定是合法的。
输出格式:
输出一行,即所求的中缀表达式与对应的计算结果(精度保留两位小数),表达式与计算结果之间用空格隔开。注意输出的中缀表达式中不允许有空格。数据保证中缀表达式合法,且计算过程中不会出现除数为0的情况。
样例输入:
5
*3 + 4 6(*与3 之间是有空格的)
1 2
--
3 4
--
--
样例输出:
3*(4+6) 30.00 ps:*与3 之间、-与-之间是有空格的
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 105
struct data {
char l,r;
};
data b[N];
int n,i=0;
char a[N];
void dfs(int t){
if(b[t].l!='-'&&t+1<n){
dfs(b[t].l);
}
cout<<a[t]<<" ";
if(b[t].r!='-'&&t+1<n){
dfs(b[t].r);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
cin>>b[i].l>>b[i].r;
}
dfs(0);
return 0;
}
麻烦dalao帮忙看一下代码哪里错了