【树的遍历】SSL 1389

求一棵树的前序遍历,即 b f s

需要注意的是,由于本题奇怪的输入,我们需要将每层的答案放过来倒序输出,可以用一个 v e c t o r 存储每层的节点


代码

#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]);//遍历
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81810179