PAT A 1130 INFIX
中序遍历求带括号的中缀表达式
重点是括号怎么输出
注意到语法树的非叶子节点代表一个表达式,所以有一对对应的括号
又因为题干里要求整个表达式不应该套括号(就是不能输出这种格式:(a+b)正确答案应当输出a+b)
所以当前结点是根节点时不加括号
代码
#include <cstdio>
#include <string>
using namespace std;
int n;
bool isnt_root[50]={false};
struct node{
string val;
int left;
int right;
}tree[50];
void inorder(int now)
{
if(now!=-1)
{
if(isnt_root[now]!=false&&(tree[now].left!=-1||tree[now].right!=-1))
printf("(");
inorder(tree[now].left);
printf("%s",tree[now].val.c_str());
inorder(tree[now].right);
if(isnt_root[now]!=false&&(tree[now].left!=-1||tree[now].right!=-1))
printf(")");
}
}
int main()
{
scanf("%d",&n);
char ch=getchar();
for(int i=1;i<=n;i++)
{
char temp[20];
scanf("%s%d%d",temp,&tree[i].left,&tree[i].right);
char ch=getchar();
tree[i].val=temp;
if(tree[i].left!=-1)isnt_root[tree[i].left]=true;
if(tree[i].right!=-1)isnt_root[tree[i].right]=true;
}
int root;
for(int i=1;i<=n;i++)
{
if(isnt_root[i]==false)
{
root=i;
break;
}
}
inorder(root);
return 0;
}