• 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
    ",max,height);
        return 0;
    
    }
  • 相关阅读:
    android添加文件打开方式以及参数传递
    Android文字图片写入CSV(Base64)并分享
    Fragment嵌套Fragment要用getChildFragmentManager
    Android数据库存取图片以及转换成缩略图
    2015已经过去三分之一了
    GridView和ListView简单使用
    WPF处理Windows消息
    90后码农的北京求职之旅
    排序算法复习—快速排序
    排序算法复习—归并排序
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5346723.html
Copyright © 2020-2023  润新知