点击查看题目
#include <bits/stdc++.h>
using namespace std;
int n;//n个结点
int vis[10];//检测数组位置有没有被遍历过
struct btnode
{
int l = -1;
int r = -1;
} bt[10];//树,-1代表为叶子(默认为-1)
vector<int> ans[100];//关键可变数组(用数组一样)
/*
*可变数组作用:实现题目要求输出顺序
*解释:每次函数传入的cnt本质上是树的深度,
*而ans[cnt]自然代表第cnt深度符合条件的叶子结点。
*/
void bfs(int k,int cnt)//注:不是bfs,写习惯了
{
if(bt[k].l==-1&&bt[k].r==-1)
{
ans[cnt].push_back(k);
return;
}
if(bt[k].l!=-1){
bfs(bt[k].l,cnt+1);
}
if(bt[k].r!=-1){
bfs(bt[k].r,cnt+1);
}
}
int main()
{
memset(vis, 0, sizeof vis);//重置visited数组
cin >> n;
for (int i = 0; i < n; i++)
{
char a;
char b;
cin >> a >> b;
if (a != '-')
{
bt[i].l = a-'0';
vis[bt[i].l]=1;
}
if (b != '-')
{
bt[i].r = b-'0';
vis[bt[i].r] = 1;
}
}
int root=0;//代表根节点
for (int i = 0; i < n; i++)//寻找根节点
{
if (vis[i] == 0)
{
root = i;
break;
}
}
bfs(root,0);
int flag=0;
for(int j=0;j<n;j++)
{
for(int i=0;i<ans[j].size();i++)
{
if(flag==0)
{
flag=1;
}
else cout<<" ";
cout<<ans[j][i];
}
}
return 0;
}