PAT(A)-1130. Infix Expression (25)(树的中序遍历)

来源:互联网 发布:星际皆知你爱我微盘 编辑:程序博客网 时间:2024/06/06 02:29

记录一个菜逼的成长。。

题目链接

题目大意:
给你n个点的值以及左右孩子编号。
输出表达式。

遍历的时候,如果是叶子节点的就不需要给左右括号
输出的时候去掉最外面的一对括号。
注意n==1的情况

#include <bits/stdc++.h> using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define clr clear()#define pb push_backconst int maxn = 1500000 + 10;struct Node{    int l,r;}tree[maxn];int d[100];string str[100];vector<string>ans;void in_tra(int t){    if(t == -1)return ;    if(tree[t].l != -1 || tree[t].r != -1)ans.pb("(");    in_tra(tree[t].l);    ans.pb(str[t]);    in_tra(tree[t].r);    if(tree[t].l != -1 || tree[t].r != -1)ans.pb(")");}int main(){    int n;    while(~scanf("%d",&n)){        for( int i = 1; i <= n; i++ ){            string ch;            int u,v;            cin>>ch;            scanf("%d%d",&u,&v);            str[i] = ch;            if(u != -1)d[u]++;            if(v != -1)d[v]++;            tree[i].l = u,tree[i].r = v;        }        if(n == 1){            cout<<str[1]<<endl;            continue;        }        int root ;        for( int i = 1; i <= n; i++ ){            if(!d[i]){root = i;break;}        }        in_tra(root);        for( int i = 1; i < ans.size()-1; i++ )            cout<<ans[i];        puts("");    }    return 0;}
0 0
原创粉丝点击