61 lines
1.4 KiB
C++
61 lines
1.4 KiB
C++
#include <bits/stdc++.h>
|
||
using namespace std;
|
||
const int N = 30;
|
||
|
||
int n;
|
||
string w[N];
|
||
int l[N], r[N], in[N];
|
||
int isleaf[N];
|
||
|
||
/*
|
||
题目描述:
|
||
给出中缀表达式的语法树 请你将后缀表达式输出 括号体现优先级 操作符不可用括号包含。
|
||
|
||
思路:
|
||
后缀表达式就是把运算符后置的表达式,可以抽象成一棵二叉树,其中的的节点有两种情况:
|
||
|
||
(1)有左右儿子
|
||
(2)只有右儿子
|
||
只有右儿子的情况就是负数啦~ 测试用例: - -1 6
|
||
|
||
然后就是找根,这个很简单,统计所有节点的入度,唯一的一个入度是 0 的节点就是根。
|
||
|
||
再写个简单的递归就可以了。
|
||
|
||
|
||
8
|
||
* 8 7
|
||
a -1 -1
|
||
* 4 1
|
||
+ 2 5
|
||
b -1 -1
|
||
d -1 -1
|
||
- -1 6
|
||
c -1 -1
|
||
|
||
输出样例1:
|
||
(((a)(b)+)((c)(-(d))*)*)
|
||
*/
|
||
|
||
string dfs(int u) {
|
||
if (isleaf[u]) return "(" + w[u] + ")";
|
||
if (l[u] == -1 && r[u] != -1) return "(" + w[u] + dfs(r[u]) + ")"; // 负号
|
||
return "(" + dfs(l[u]) + dfs(r[u]) + w[u] + ")"; // 后缀表达式
|
||
}
|
||
|
||
int main() {
|
||
cin >> n;
|
||
for (int i = 1; i <= n; i++) {
|
||
cin >> w[i] >> l[i] >> r[i];
|
||
if (l[i] != -1) in[l[i]]++;
|
||
if (r[i] != -1) in[r[i]]++;
|
||
if (l[i] == -1 && r[i] == -1) isleaf[i] = 1; // 叶子
|
||
}
|
||
// 找根
|
||
int root;
|
||
for (root = 1; root <= n; root++)
|
||
if (!in[root]) break; // 入度为零的是根
|
||
cout << dfs(root) << endl;
|
||
|
||
return 0;
|
||
} |