需要注意的是最外层多了一对括号,这里要去掉。但是也可能存在-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;
}
本文介绍了一个使用C++实现的表达式树遍历算法,该算法通过递归方式生成带括号的表达式字符串,并适当地移除最外层括号。文章详细展示了如何构造表达式树的数据结构,并提供了完整的代码示例。
296

被折叠的 条评论
为什么被折叠?



