PATA1130_求表达式(有小坑)

本文介绍了一个使用C++实现的表达式树遍历算法,该算法通过递归方式生成带括号的表达式字符串,并适当地移除最外层括号。文章详细展示了如何构造表达式树的数据结构,并提供了完整的代码示例。

需要注意的是最外层多了一对括号,这里要去掉。但是也可能存在-a这种没有括号的情况,所以要检查s[0] == '('才能去括号。

#include <bits/stdc++.h>
using namespace std;
struct node {
    string data;
    int lc, rc;
}Node[30];
bool vis[30] = {false};
string IE (int r) {
    if (Node[r].lc == -1 && Node[r].rc == -1) return Node[r].data;
    if (Node[r].lc == -1 && Node[r].rc != -1) return "(" + Node[r].data + IE(Node[r].rc)  + ")";
    if (Node[r].lc != -1 && Node[r].rc != -1) return "(" + IE(Node[r].lc) + Node[r].data + IE(Node[r].rc) + ")";
}
int main() {
    int n, lc, rc, root;
    scanf ("%d", &n);
    for (int i = 1; i <= n; i++) {
        string s;
        cin >> Node[i].data >> Node[i].lc >> Node[i].rc;
        vis[Node[i].lc] = true;
        vis[Node[i].rc] = true;
    }
    for (int i = 1; i < 30; i++) {
        if (vis[i] == false) {
            root = i;
            break;
        }
    }
    string s = IE(root);
    if (s[0] == '(') s = s.substr(1, s.size() - 2);
    cout << s;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值