【机试备考】Day25-二叉树的层数 | 层序输出

题目

BUPT 2012 网研 ProblemB
老师有一个问题想考考mabo,但是mabo不会,所以想请你来帮帮忙。
问题如下:
给一个二叉树
请把这个棵二叉树按层来打印。如果为相同层,需要从左到右打印。一个节点是先添加左节点后添加右节点,即添加顺序与输入顺序一致。

输入描述

首先输入一个整数T,表示一共有T组数据 0<T<=10
再输入两个整数N,M(0<=N,M<=100
表示下面有N行,这个树有M个节点(1号节点是这棵树的根节点)
每一行两个整数a,b(1<=a,b<=M)
表示节点a的父亲是节点b

输出描述

对于每组先输出一行 "Qi:"表示第i个问题
然后接下来输出每个问题二叉树每层的节点,在同一层的节点用空格分开,同一层输出在一行(每一行末尾没有空格),不同的层输出在不同行(入下面Sample Ouput所示)

示例

输入

2
4 5
2 1
3 1
4 2
5 4
1 2
2 1

输出

Q1:
1
2 3
4
5
Q2:
1
2

题解

虽然是的问题,但却不用建树

因为是按层顺序输入的,让这道题简单了不少,不然至少是C题的难度

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    
	int t;
	cin>>t;
	for(int i=1;i<=t;i++)
    {
    
    
        int n,m;
        int level[105];
        level[1]=1;
        int depth=1;//树的层数
        cin>>n>>m;
        while(n--)
        {
    
    
            int s,f;
            cin>>s>>f;
            level[s]=level[f]+1;//儿子比父亲层数+1
            if(level[s]>depth)
                depth=level[s];
        }
        /*按层数出*/
        cout<<"Q"<<i<<":"<<endl;
        for(int j=1;j<=depth;j++)//层
        {
    
    
            int cnt=0;//当层结点数
            for(int k=1;k<=m;k++)//结点
            {
    
    
                if(level[k]==j)
                {
    
    
                    if(cnt==0)
                        cout<<k;
                    else
                        cout<<" "<<k;
                    cnt++;
                }
            }
            cout<<endl;
        }
	}
}