树的遍历之后序遍历和层次遍历(河南农业大学oj--1216)

题目链接:题目传送门
题目描述
给定一颗有n个结点的树,然后给出n-1条关系,第i条包含两个数字x,y分别代表x与y之间有边相连,且x是y的父节点。
请输出这个树的后序遍历及其层次遍历,假定始终以1为根。

请使用孩子兄弟表示法实现,请按照边的给定顺序来连接兄弟节点.
例如:
先1 2,后1 3,那么3就是2的兄弟
先1 3,后1 2,那么2就是3的兄弟
先1 2,后1 3,后1 4,那么3是2的兄弟,4是3的兄弟
输入
一个数字n(1<=n<=1000)。
接下来n-1行,每行包含两个数字x,y分别代表x与y之间有边相连,且x是y的父节点。(1<=x,y<=n)
保证输入的是一颗树。
输出
输出,后序遍历及其层次遍历
样例输入 Copy

7
1 2
1 3
1 4
2 5
1 6
3 7

样例输出 Copy

5 2 7 3 4 6 1
1 2 3 4 6 5 7

思路:
通过dfs中进行先序遍历、中序遍历、后序遍历
通过bfs进行层次遍历
代码中有详细解释
代码:

#include
using namespace std;
const long long int MAX=1010;
#define il inline
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int n;
vector<int> g[MAX];
queue<int> q;
int v[MAX];
void dfs(int x)
{
    v[x]=1;
    for(int i=0;i<g[x].size();i++)
    {
        int t=g[x][i];
        if(v[t])continue;//重复的不要加入
        dfs(t);//不断深入
        printf("%d ",t);//后序输出
    }
}
void bfs(int x)
{
    memset(v,0,sizeof(v));
    q.push(x);
    v[x]=1;
    while(!q.empty())//队列为空的时候停止
    {
        int t=q.front();
        printf("%d ",t);
        q.pop();
        for(int i=0;i<g[t].size();i++)//同一层次不断加入
        {
            int tmp=g[t][i];
            if(v[tmp])continue;
            v[tmp]=1;//重复的不要加入
            q.push(tmp);
        }
    }
    printf("\n");
}
int main()
{
    n=read();
    g[-1].push_back(1);//给根节点设置父亲节点
    for(int i=1;i<n;i++)
    {
        int x,y;
        x=read(),y=read();
        g[x].push_back(y);
        g[y].push_back(x);
    }
    dfs(-1);
    printf("\n");
    bfs(1);
    return 0;
}

你可能感兴趣的:(dfs,数据结构,算法,dfs,数据结构)