PAT甲级1130
题目大意:给出n个节点存放的内容和左右孩子编号,求这棵树的中序表达式。
递归中序遍历即可,在遍历左孩子前加左括号,在遍历右孩子后加右括号。额外开辟个cnt数组,只要找到从1到n中未出现的数就是根节点。这里博主一开始cnt设的21做的后两个测试点段错误,后来210倒数第二个还是段错误,2100才全过,这点还没搞明白什么鬼。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct node{
string data;
int left,right;
};
int root;
node nd[21];
void preTraversal(int index){
if(index==-1) return ;
if((nd[index].left!=-1||nd[index].right!=-1)&&index!=root) printf("(");
preTraversal(nd[index].left);
cout<<nd[index].data;
preTraversal(nd[index].right);
if((nd[index].left!=-1||nd[index].right!=-1)&&index!=root) printf(")");
}
int main(){
int n;
scanf("%d",&n);
int cnt[2100];
for(int i=1;i<=n;i++){
cin>>nd[i].data;
scanf("%d%d",&nd[i].left,&nd[i].right);
if(nd[i].left!=-1) cnt[nd[i].left]++;
if(nd[i].right!=-1) cnt[nd[i].right]++;
}
for(int i=1;i<=n;i++){
if(cnt[i]==0){
root=i;
break;
}
}
if(nd[root].left==-1&&nd[root].right==-1) cout<<nd[root].data;
else preTraversal(root);
system("pause");
return 0;
}