思路:
1.先建树,再对树进行先根遍历;
2.若遍历某个结点不是叶子结点且不是根结点,则此次的表达式要用括号包围;
3.值一定是叶子结点,运算符一定不是叶子结点;
代码:
#include<iostream>
#include<unordered_map>
using namespace std;
struct node{
string val;
int left,right;
};
unordered_map<int,node> mp;
int root;
string dfs(int n){
string s=mp[n].val;
if(mp[n].left!=-1) s=dfs(mp[n].left)+s;
if(mp[n].right!=-1) s+=dfs(mp[n].right);
if(n!=root&&(mp[n].left!=-1||mp[n].right!=-1))
s='('+s+')';
return s;
}
int main(){
int n;
cin>>n;
root=n*(n+1)/2;
for(int i=1;i<=n;i++){
cin>>mp[i].val>>mp[i].left>>mp[i].right;
if(mp[i].left!=-1) root-=mp[i].left;
if(mp[i].right!=-1) root-=mp[i].right;
}
cout<<dfs(root);
return 0;
}