inorder虽然遍历的是左中右,也可以在去左边的路上完成一些的别的操作,放在inorder(node->left)前面,也可以在结束右子树遍历后有别的操作,放在inorder(node->right)后边
只能感觉是中序遍历,括号的添加实在巧妙
#include<bits/stdc++.h>
using namespace std;
bool isexist[30]={false};
int root=1;
struct node{
string c;
int left,right;
}N[30];
void inorder(int i){
if(i==-1) return;
if(i!=root&&N[i].right!=-1) cout<<"(";
inorder(N[i].left);
cout<<N[i].c;
inorder(N[i].right);
if(N[i].right!=-1&&i!=root) cout<<")";//这一句为什么不是==-1在叶子结点输出后加括号呢
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>N[i].c>>N[i].left>>N[i].right;
if(N[i].left!=-1) isexist[N[i].left]=true;
if(N[i].right!=-1) isexist[N[i].right]=true;
}
while(isexist[root]==true) root++;
inorder(root);
}