时间限制:1s 空间限制:128000KB题目等级:白银 silver
题目描述
给出一个二叉树,输出它的最大宽度和高度。
输入描述
第一行一个整数n。
下面n行每行有两个数,对于第 i 行的两个数,代表编号为 i 的节点所连接的两个左右儿子的编号。如果某个儿子为空,则为0。
输出描述
输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。
样例输入
5
2 3
4 5
0 0
0 0
0 0
样例输出
2 3
数据范围及提示
n<16
默认第一个是根节点
解题思路
1、在输入左右孩子时根据 孩子节点深度=父节点深度+1 递推出各节点深度
2、以节点深度(所在层)为基本单位来统计各层宽度
3、对比各层宽度和各节点深度来得到最大宽度和最大高度
AC代码如下:
#include <stdio.h>
const int MAXLENGTH=17;
struct node{
int l,r;
}bt[MAXLENGTH];
int main()
{
int n;
scanf( "%d",&n );
int wid[MAXLENGTH]={0};//存储各层宽度
int dep[MAXLENGTH]={0};//存储各节点深度
dep[1]=1;
for( int i=1;i<=n;i++ ){
scanf( "%d%d",&bt[i].l,&bt[i].r );
if( bt[i].l ){//存在左孩子
dep[ bt[i].l ] = dep[i]+1;//孩子深度等于父节点深度+1
++wid[ dep[ bt[i].l ] ];//孩子深度(即所在层)对应的节点宽度+1
}
if( bt[i].r ){
dep[ bt[i].r ] = dep[i]+1;
++wid[ dep[ bt[i].r ] ];
}
}
int maxdep=1,maxwid=1;//只有一个根时最大宽度和深度都为1
for( int i=1;i<=n;i++ ){
maxdep = maxdep>dep[i] ? maxdep:dep[i];//取所有节点的最大深度
maxwid = maxwid>wid[ dep[i] ] ? maxwid:wid[ dep[i] ];//取所有层的最大宽度
}
printf("%d %d\n",maxwid,maxdep);
return 0;
}