您的位置:首页 > 理论基础 > 计算机网络

1501 二叉树最大宽度和高度——http://codevs.cn/problem/1501/

2016-04-02 00:06 344 查看
第一部分:题目

题目描述 Description

给出一个二叉树,输出它的最大宽度和高度。

输入描述 Input Description

第一行一个整数n。

下面n行每行有两个数,对于第i行的两个数,代表编号为i的节点所连接的两个左右儿子的编号。如果没有某个儿子为空,则为0。

输出描述 Output Description

输出共一行,输出二叉树的最大宽度和高度,用一个空格隔开。

样例输入 Sample Input

5

2 3

4 5

0 0

0 0

0 0

样例输出 Sample Output

2 3

数据范围及提示 Data Size & Hint

n<16

默认第一个是根节点

以输入的次序为编号

2-N+1行指的是这个节点的左孩子和右孩子

注意:第二题有极端数据!

1

0 0

这题你们别想投机取巧了,给我老老实实搜索!(稍微注意一下就好了)

第二部分:思路

把节点用二维数组存储,同时记录子节点编号以及子节点所在行号,具体见代码注释

第三部分:代码

#include<stdio.h>
int main()
{
//二维数组中每一行表示一个根节点以及它的子节点,还有一个表示它的子节点所在行号
int n,i,s[32][4],len=0,x,y,height=1,j;//二维数组存储二叉树各节点以及它的子节点
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[len][0]=i+1;//根节点编号
scanf("%d %d",&x,&y); //存储各根节点的子节点
s[len][1]=x;//左节点
s[len][2]=y;//右节点
if(i==0)//如果i=0表示这是编号为1的根节点的子节点,那么它的子节点肯定在第2行
{
s[len++][3]=2;
}
else
{
//既然存在子节点,那么这个根节点肯定是某个节点的子节点,找到它,就知道
//该根节点在第几行,那么它的子节点就在下一行。
for(j=0;j<len;j++)
{
if(s[j][1]==i+1||s[j][2]==i+1)
{
s[len++][3]=s[j][3]+1;
break;
}
}
}
}
int sum,max=1;//max表示最大宽度,为什么初始为1呢,正如题目所说至少有一个根节点
//计算最大宽度,高度
//最大宽度:就是同一行上最多有多少个节点,高度就是有多少行的宽度是正数
for(i=1;i<=n;i++)
{
sum=0;
for(j=0;j<len;j++)
{
if(s[j][3]==i)
{
if(s[j][1]!=0)
{
sum++;
}
if(s[j][2]!=0)
{
sum++;
}
}
}
if(max<sum)
{
max=sum;
}
if(sum!=0)
{
height++;
}
}
printf("%d %d\n",max,height);
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: