BUPT OJ100 二叉树的层数

44 篇文章 3 订阅

题目描述

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

判断二叉树的同一层可由深度depth实现, *lnext, *rnext保存的分别是左子节点和右子节点的地址

P.S. 前面最后的输出部分也可以由C++的STL queue内pop(), push()来实现



/*
USER_ID: test#birdstorm
PROBLEM: 100
SUBMISSION_TIME: 2014-03-02 11:54:13
*/
#include <stdio.h>
#include <stdlib.h>
#define For(i,m,n) for(i=m;i<n;i++)
#define MAXN 105
 
typedef struct tree{
    int depth, name;
    struct tree *lnext, *rnext;
}tree;
 
main()
{
    int i, j, T, t, n, m, x, y, flag;
    int c[MAXN];
    struct tree d[MAXN];
    scanf("%d",&T);
    For(t,1,T+1){
        scanf("%d%d",&n,&m);
        For(i,0,m+1){
            d[i].depth=0;
            d[i].lnext=d[i].rnext=NULL;
        }
        d[1].depth=1;
        For(i,0,n){
            scanf("%d%d",&x,&y);
            d[x].name=x;
            d[y].name=y;
            if(d[y].lnext==NULL) d[y].lnext=&d[x];
            else d[y].rnext=&d[x];
            d[x].depth=d[y].depth+1;
        }
        printf("Q%d:\n",t);
        i=j=c[1]=1; flag=1;
        while(i<=j){
            if(d[c[i]].lnext!=NULL) c[++j]=(*d[c[i]].lnext).name;
            if(d[c[i]].rnext!=NULL) c[++j]=(*d[c[i]].rnext).name;
            if(i>1) putchar(d[c[i]].depth!=flag?'\n':' ');
            printf("%d",d[c[i]].name);
            flag=d[c[i]].depth;
            i++;
        }
        puts("");
    }
    return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值