A1130 Infix Expression (25分)

一、技术总结

  1. 这题是关于二叉树,使用中序遍历的方法进行输出一个算式,要加括号,最外层不用加。
  2. 存储使用node结构体,数值跟左右子树;同时使用have数组用于判断根结点开始的位置。
  3. 使用dfs进行深度遍历:会出现四种情况(但是有一种不会出现,即左子树不空右子树为空的情况):
  • 左右子树都为空
  • 左空右不空
  • 右空左不空
  • 左右都不空
  1. 这里可能会有担心,在dfs中顺序有关系吗,答案是没有关系的,遍历会按照中序遍历的结果返回。
  2. 这里还有介绍string的几个函数,一个是size()返回字符串中字符的数量,等于length(),还有就是字符串截取函数substr(),如str.substr(n, m)表示从str字符串的第n个字符开始,取m个字符。

二、参考代码

#include<bits/stdc++.h>
using namespace std;
struct node{
	string data;
	int L, R;
}ans[100];
string dfs(int root){
	if(ans[root].L == -1 && ans[root].R == -1) return ans[root].data;
	if(ans[root].L != -1 && ans[root].R != -1) return "(" + dfs(ans[root].L)+ ans[root].data + dfs(ans[root].R) + ")";
	if(ans[root].L == -1 && ans[root].R != -1) return "(" + ans[root].data + dfs(ans[root].R)+ ")";
}
int main(){
	int have[100] = {0}, n, root = 1;
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		cin >> ans[i].data >> ans[i].L >> ans[i].R;
		if(ans[i].L != -1) have[ans[i].L] = 1; 
		if(ans[i].R != -1) have[ans[i].R] = 1; 
	}
	while(have[root] == 1) root++;
	string ans = dfs(root);
	if(ans[0] == '(') ans = ans.substr(1, ans.size() - 2);
	cout <<ans;
	return 0;
}
posted @ 2020-06-09 21:38  睿晞  阅读(146)  评论(0编辑  收藏  举报