PTA 1130 Infix Expression

题目链接

翻译:

给定一个语法树(二叉树),你需要输出相应的中缀表达式,其中括号反映了运算符的优先级。

输入规格:
每个输入文件包含一个测试用例。对于每个用例,第一行给出一个正整数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值