题目
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;
}
}
}