一、技术总结
- 这题是关于二叉树,使用中序遍历的方法进行输出一个算式,要加括号,最外层不用加。
- 存储使用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;
}