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;

}

 

posted @ 2016-04-02 00:06  喝醉的香锅锅  阅读(233)  评论(0编辑  收藏  举报