
你们要的中缀表达式树Case Time Limit: 100 MS (Others) / 200 MS (Java) Case Memory Limit: 256 MB (Others) / 512 MB (Java)Accepted: 74 Total Submission: 280Problem Description给定一棵二叉树二叉树的各个结点要么表示四则运算符、-、、/要么表示一个不超过10的非负整数。将这棵二叉树看作中缀表达式树输出对应的中缀表达式以及该中缀表达式的计算结果。注意输出的中缀表达式中除了最外层以外内层的每个“左操作数 操作符 右操作数”形式的两侧都要加上一对小括号。例如2(3(4/5))就是一个可能的正确输出。Input每个输入文件中一组数据。第一行一个正整数NN30代表二叉树的结点个数结点编号为0到N-1。第二行按结点编号从小到大的顺序给出N个结点的值用空格隔开其要么是四则运算符、-、*、/的其中一个要么是一个不超过10的非负整数。接下来按结点编号从小到大的顺序给出N行每行为两个编号分别代表该结点的左孩子编号和右孩子编号如果不存在左(右)孩子那么就用字符’-代替。数据保证编号在0到N-1之间且中缀表达式树一定是合法的。Output输出一行即所求的中缀表达式与对应的计算结果精度保留两位小数表达式与计算结果之间用空格隔开。注意输出的中缀表达式中不允许有空格。数据保证中缀表达式合法且计算过程中不会出现除数为0的情况。Sample Input53 4 61 23 4Sample Output3*(46) 30.002017#includebits/stdc.h #includestring #includealgorithm using namespace std; const int maxn 1e2; struct node{ string data; int left; int right; }a[maxn]; string save[maxn] ; int num; int Dfs(int n, int depth){ int tempa, tempb; if(a[n].left ! -1 a[n].right ! -1 depth ! 0) cout (; if(a[n].left ! -1){ tempa Dfs(a[n].left, depth 1); } cout a[n].data; if(a[n].right ! -1){ tempb Dfs(a[n].right, depth 1); } if(a[n].left ! -1 a[n].right ! -1 depth ! 0) cout (; if(a[n].left ! -1 a[n].right ! -1){ if(a[n].data *) return tempa * tempb; if(a[n].data ) return tempa tempb; if(a[n].data -) return tempa - tempb; if(a[n].data /) return tempa / tempb; }else return stoi(a[n].data); } int main() { int i, j ; string tempa, tempb; cin num; for(i 0; i num; i){ cin save[i]; } for(i 0; i num; i){ cin tempa tempb; if(tempa -){ a[i].left -1; }else a[i].left stoi(tempa); if(tempb -){ a[i].right -1; }else a[i].right stoi(tempb); a[i].data save[i]; } int sum Dfs(0, 0); cout sum; return 0; }