A1130 Infix Expression (25分)
一、技术总结
- 这题是关于二叉树,使用中序遍历的方法进行输出一个算式,要加括号,最外层不用加。
- 存储使用node结构体,数值跟左右子树;同时使用have数组用于判断根结点开始的位置。
- 使用dfs进行深度遍历:会出现四种情况(但是有一种不会出现,即左子树不空右子树为空的情况):
- 左右子树都为空
- 左空右不空
- 右空左不空
- 左右都不空
- 这里可能会有担心,在dfs中顺序有关系吗,答案是没有关系的,遍历会按照中序遍历的结果返回。
- 这里还有介绍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;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.