Link: 4274. 后缀表达式 - AcWing题库
题目要求是对树进行 特殊的 后续遍历
后续遍历: 按照 左 右 子的方法进行遍历
特殊:如果不存在左子树 则先遍历 子 在遍历右边
ADT::
string info; // 存信息
int l;// 左字数的角标
int r;//右子树的脚标
用这种ADT 构建一个 以数组角标为序号的树
后续遍历
// 后续遍历
void dfs(int h){
if(a[h].l!=-1) dfs(a[h].l);
if(a[h].r!=-1) dfs(a[h].r);
cout<<a[h].c<<' ';
return ;
}
//特殊化:
void dfs(int h){
if(a[h].l!=-1) dfs(a[h].l);
if(a[h].l==-1){
cout<<a[h].c<<' ';
if(a[h].r!=-1) dfs(a[h].r);
}else{
if(a[h].r!=-1) dfs(a[h].r);
cout<<a[h].c<<' ';
}
return ;
}
确定括号
每一个子树都带一个括号 , 一个节点也可以看成子树
寻找根节点
没有被当成子节点的节点 一定是根节点, 所以直接去找所有节点里面 哪个节点没有被当成子节点
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef struct node{
int id;
string c;
int l,r;
}node;
node a[30];
int t[30]{0};
void dfs(int h){
cout<<'(';
if(a[h].l!=-1) dfs(a[h].l);
if(a[h].l==-1){
cout<<a[h].c;
if(a[h].r!=-1) dfs(a[h].r);
cout<<')';
}else{
if(a[h].r!=-1) dfs(a[h].r);
cout<<a[h].c<<')';
}
return ;
}
int main(){
ios::sync_with_stdio(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].c>>a[i].l>>a[i].r;
if(a[i].l>0) t[a[i].l]=1;
if(a[i].r>0) t[a[i].r]=1;
}
int h;
for(int i=1;i<=n;i++){
if(!t[i]){
h=i;break;
}
}
dfs(h);
}