题目描述
老师有一个问题想考考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所示)
代码
#include<iostream>
#include <cstdio>
#include <string>
//#include <algorithm>
#include <vector>
#include<cstring>
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
const int MAX=101;
struct Nood{
Nood* lchird;
Nood* rchird;
Nood* parent;
int value;
int floor;
//int visited;
//Nood()
}nood[MAX];
int visited[MAX];
int print[MAX];
int Floor(Nood *a)
{
if(a->value==1)
a->floor=1;
else
a->floor=Floor(a->parent)+1;
return a->floor;
}
void create(Nood *s, Nood *n) {
if (s->lchird != NULL) {
s->rchird = n;
n->parent = s;
// printf("nood[%d]->rchird=%d\n",s->value,s->rchird->value);
//n->lchild = NULL;
//n->rchild = NULL;
}
else{
s->lchird = n;
n->parent = s;
n->rchird=NULL;
// printf("nood[%d]->lchird=%d\n",s->value,s->lchird->value);
}
}
int main()
{
int t,n,m,child,parent,num=0;
scanf("%d",&t);
while(t--)
{
memset(nood,0,sizeof(nood));
memset(visited,0,sizeof(visited));
num++;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d %d",&child,&parent);
visited[parent]=1;
visited[child]=1;
nood[parent].value=parent;
nood[child].value=child;
create(&nood[parent],&nood[child]);
//printf(" nood[%d]->visited %d\n",parent,nood[parent]->visited);
//printf(" nood[%d]->visited %d\n",child,nood[child]->visited);
}
//printf("NO1 %d\n",m);
int floor=0;
for(int i=1;i<=m&&(visited[i]==1);i++)
{
//printf("%d floor %d\n",i,nood[i]->floor);
nood[i].floor=Floor(&nood[i]);
//printf("%d floor %d visited %d\n",i,nood[i]->floor,visited[i]);
if(floor<nood[i].floor)
floor=nood[i].floor;
}
//printf("floor-MAX %d\n",floor);
printf("Q%d:\n",num);
for(int j=1;j<=floor;j++)
{
vector<int> a;
// printf("j %d \n",j);
for(int i=1;i<=m&&(visited[i]==1);i++)
{
//printf("j %d %d floor %d\n",j,i,nood[i]->floor);
if(nood[i].floor==j)
{
if(nood[i].parent!=NULL&&nood[i].parent->rchird!=NULL&&nood[i].parent->lchird->value>nood[i].parent->rchird->value)
{
int temp=nood[i].parent->rchird->value;
nood[i].parent->rchird->value=nood[i].parent->lchird->value;
nood[i].parent->lchird->value=temp;
// printf()
}
a.push_back(nood[i].value);
//printf("%d ",nood[i].value);
}
}
for(int k=0;k<a.size();k++)
{
if(k!=a.size()-1)
printf("%d ",a[k]);
else printf("%d",a[k]);
}
printf("\n");
}
}
return 0;
}