求一棵树的前序遍历,即 序
需要注意的是,由于本题奇怪的输入,我们需要将每层的答案放过来倒序输出,可以用一个 存储每层的节点
代码
#include<cstdio>
#include<queue>
using namespace std;int root,l[100001],n,k,fa,d[100001];
struct node{int next,to;}e[100001];
vector<int>dd[100001];
inline void bfs(register int st)
{
queue<int>q;q.push(st);
dd[0].push_back(st);
while(q.size())
{
int x=q.front();q.pop();
for(register int i=l[x];i;i=e[i].next)
{
int y=e[i].to;
d[y]=d[x]+1;//记录深度
dd[d[y]].push_back(y);//当前深度多了一个节点
q.push(y);
}
}
}
signed main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)
{
scanf("%d%d",&k,&fa);
if(fa==0) root=k;//找到根节点
else
{e[i].to=k;e[i].next=l[fa];l[fa]=i;}
}
bfs(root);//宽搜
for(register int i=0;i<=100000&&dd[i].size();i++)
for(register int j=dd[i].size()-1;j>=0;j--)
printf("%d ",dd[i][j]);//遍历
}