百度2018春招开发测试工程师编程题题解.md

武培轩 2020年02月06日 64次浏览

题目描述

在一个家庭中,每位成员都有手机。这家户主维护一棵家族树,树的每个节点代表一位家庭成员,每个节点的值代表他她所拥有的手机数量,户主作为这棵树的根。户主想要找到同一代家庭成员所拥有手机的最大数量。属于树中同一级的所有成员都被视为同一代。

编写一个算法,求出同一代家庭成员所拥有手机的最大数量。

输入

函数/方法的输入包含一个参数familyRoot,表示家族树的根。

输出

返回表示同一代家庭成员所拥有手机的最大数量的整数。

限制条件

0 <= N <= 10^5;其中N表示节点数.
0 <= M <= 10^3;其中M表示同一代人所拥有的手机数

请注意

每个节点最多有100个子节点。

示例

输入:

    10    
   /  \
  11   10
 / \  / \
2  3 1   5

输出:21

说期

第1步:第1、2和3级的总和分别是10, 21和11。

第2步:第2级的最大总和是21.因此输出为21。

因此输出为21。

帮助程序说明

以下类用于表示n叉树的一个节点,并已在默认代码中实现(请勿在代码中再次写入此定
义):

class NAryNode
{
    int key;
    List <NAryNode> child;

    public NAryNode(int key)
    {
        this.key = key;
        this.child = new ArrayList<NAryNode>();
    }
}

思路

按层次遍历二叉树

访问根节点,并将根节点入队。

当队列不空的时候,重复以下操作。

  1. 弹出一个元素。作为当前的根节点。
  2. 如果根节点有孩子,访问孩子节点,并将孩子节点入队。

代码实现

package baidu.demo3;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Main {
    int maxlevelsum(NAryNode pRoot) {
        if (pRoot == null) {
            return 0;
        }
        //使用队列,先进先出
        Queue<NAryNode> queue = new LinkedList<>();
        int max = 0;
        int maxSum = 0;
        int start = 0;
        int end = 1;
        queue.add(pRoot);
        while (!queue.isEmpty()) {
            NAryNode temp = queue.remove();
            start++;
            //每访问一个节点,就把此节点的孩子节点加入队列,并记录下一层要计算的个数
            if (temp.child != null) {
                List<NAryNode> list = temp.child;
                for (NAryNode n :
                        list) {
                    queue.add(n);
                }
            }
            //判断本层是否完成
            if (start == end) {
                //此时的queue中存储的都是下一层的节点,则end即为queue大小
                end = queue.size();
                start = 0;
                if (maxSum < max) {
                    maxSum = max;
                }
                max = 0;
            }
        }
        return maxSum;
    }
}