中序遍历就行,比较基础了,但是还是有3分的两个格式错误,找了半天。。。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=21;
struct Node{ //结点结构
char d[11];
int lchild,rchild;
}node[maxn];
bool isroot[maxn];
int n,root;
void inorder(int v){ //中序遍历并且输出,注意根节点递归完成前后不能输出括号
if(v==-1) return;
if(node[v].lchild!=-1&&v!=root) printf("(");
else if(node[v].lchild==-1&&node[v].rchild!=-1&&v!=root) printf("(");
inorder(node[v].lchild);
printf("%s",node[v].d);
inorder(node[v].rchild);
if(node[v].rchild!=-1&&v!=root) printf(")");
}
int main(){
int n;
scanf("%d",&n);
fill(isroot,isroot+n+1,1);
for(int i=1;i<=n;i++){
scanf("%s",node[i].d);
scanf("%d %d",&node[i].lchild,&node[i].rchild);
if(node[i].lchild!=-1) isroot[node[i].lchild]=false;
if(node[i].rchild!=-1) isroot[node[i].rchild]=false;
}
for(int i=1;i<=n;i++){ /找根节点
if(isroot[i]==true){
root=i;
break;
}
}
inorder(root);
return 0;
}