北邮复试机试:100. 二叉树的层数

题目描述

老师有一个问题想考考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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值