1501 二叉树最大宽度和高度——http://codevs.cn/problem/1501/
第一部分:题目
题目描述 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; }
害怕失败的人,已经是一个loser!