翻译:
给定一个语法树(二叉树),你需要输出相应的中缀表达式,其中括号反映了运算符的优先级。
输入规格:
每个输入文件包含一个测试用例。对于每个用例,第一行给出一个正整数N(≤ 20),表示语法树中节点的总数。然后跟随N行,每行给出一个节点的信息(第i行对应第i个节点),格式为:data left_child right_child
其中data是一个长度不超过10的字符串,left_child和right_child分别是该节点左子节点和右子节点的索引。节点的索引从1到N。空链接用-1表示。示例1和示例2对应的图形如下所示。
思路:结构体node存储,找出根节点,然后中序遍历。值得注意的是括号,是在 h(子树)>=2时使用:(子树) 根 ...
#include<iostream>
#include<string>
#include<string.h>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
struct Node{
int id=-1;
int left=-1,right=-1;
string data;
};
struct Node node[30];
int vis[30];
int n;
int getRoot(){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
if(node[i].left!=-1){
vis[node[i].left] = 1 ;
}
if(node[i].right!=-1){
vis[node[i].right] = 1 ;
}
}
int i=1;
for(i;i<=n;i++){
if(vis[i]==0)break;
}
return i;
}
int haveChild(int root){
if(node[root].left!=-1||node[root].right!=-1) return 1;
return 0;
}
void inOrder(int root){
if(root==-1) return;
if(node[root].left!=-1&&haveChild(node[root].left)){
cout<<"(";
inOrder(node[root].left);
cout<<")";
}
else{
inOrder(node[root].left);
}
cout<<node[root].data;
if(node[root].right!=-1&&haveChild(node[root].right)){
cout<<"(";
inOrder(node[root].right);
cout<<")";
}
else{
inOrder(node[root].right);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>node[i].data>>node[i].left>>node[i].right;
}
int root =getRoot();
//中序遍历输出
inOrder(root);
return 0;
}