题目翻译:
- 给定语法树,请输出其中缀表达式,用圆括号表示优先级,最后一层不要圆括号。
- 输入
- N:正整数,不超过20,语法树中结点的个数
- N个结点:结点索引为[1,N],-1代表空
题解思路:
就是二叉树的中序遍历而已,DFS就行。最外层不需要括号,这时手动遍历根结点即可。
那么如何寻找根结点的下标呢,所有结点中没有作为子结点的结点就是根结点。
什么时候输出“(”和“)”呢,在进行中序遍历的时候,在执行下一层遍历前和后,若遍历到一个结点,如果其左右子结点至少有一个不为空就分别输出“(”和“)”。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node {
string value;
int left = -1, right = -1;
};
vector<node> v(21);
int K, visited[21], root;
void inorder(int curnode)
{
if (curnode == -1) return;
if (v[curnode].left != -1 || v[curnode].right != -1)
cout << "(";
inorder(v[curnode].left);
cout << v[curnode].value;
inorder(v[curnode].right);
if (v[curnode].left != -1 || v[curnode].right != -1)
cout << ")";
}
int main()
{
cin >> K;
for (int i = 1;i <= K;i++)
{
cin >> v[i].value >> v[i].left >> v[i].right;
if (v[i].left != -1)
visited[v[i].left] = 1;
if (v[i].right != -1)
visited[v[i].right] = 1;
}
for (int i = 1;i <= K;i++)
if (!visited[i])
{
root = i;break;
}
inorder(v[root].left);
cout << v[root].value;
inorder(v[root].right);
}
坑点:
无