PAT-ADVANCED1130——Infix Expression

我的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++解题报告:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值