我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805347921805312
题目描述:
题目翻译:
1130 中缀表达式
给定一棵语法树(二叉树),你需要输出相应的中缀表达式,括号反映运算符的优先级。
输入格式:
每个输入文件包含一个测试用例。对每个测试用例,第一行给出正整数N(<= 20),它是语法树中的节点总数。然后是N行,每行以下述格式给出节点的信息(第i行对应于第i个节点):
data left_child right_child
其中data是一个不超过10个字符的字符串,left_child和right_child分别是该节点的左右子节点的索引。节点的索引从1到N,NULL用-1表示。 图1和2分别对应于样例1和2。
输出格式:
对于每个测试用例,在行中打印中缀表达式,括号反映运算符的优先级。请注意,最终表达式不能额外的括号,如示例所示。任何符号之间不能有空格。
输入样例1:
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))
输入样例1:
8
2.35 -1 -1
* 6 1
- -1 4
% 7 8
+ 2 3
a -1 -1
str -1 -1
871 -1 -1
输出样例1:
(a*2.35)+(-(str%871))
知识点:二叉树的中序遍历
思路:二叉树的中序遍历
时间复杂度和空间复杂度均是O(N)。
C++代码:
#include<iostream>
using namespace std;
struct node {
char data[11];
int lchild, rchild;
};
node Node[21];
int index = 1;
int root;
void inOrderTraversal(int head);
int main() {
int N;
scanf("%d", &N);
bool flag[N + 1];
fill(flag + 1, flag + N + 1, false);
int lchild, rchild;
for(int i = 0; i < N; i++) {
scanf("%s %d %d", Node[index].data, &lchild, &rchild);
Node[index].lchild = lchild;
Node[index].rchild = rchild;
if(lchild != -1) {
flag[lchild] = true;
}
if(rchild != -1) {
flag[rchild] = true;
}
index++;
}
for(int i = 1; i <= N; i++) {
if(!flag[i]) {
root = i;
break;
}
}
inOrderTraversal(root);
return 0;
}
void inOrderTraversal(int head) {
if(head == -1) {
return;
}
if(!(Node[head].lchild == -1 && Node[head].rchild == -1) && !(head == root)) { //如果没有左右孩子或是根节点,则不输出左括号
printf("(");
}
inOrderTraversal(Node[head].lchild);
printf("%s", Node[head].data);
inOrderTraversal(Node[head].rchild);
if(!(Node[head].lchild == -1 && Node[head].rchild == -1) && !(head == root)) { //如果没有左右孩子或是根节点,也不输出右括号
printf(")");
}
}
C++解题报告: