1. 程式人生 > >百度2018春招開發測試工程師編程題題解

百度2018春招開發測試工程師編程題題解

開發 AR 擁有 mov 最大 clas his 家庭 層次

題目描述

在一個家庭中,每位成員都有手機。這家戶主維護一棵家族樹,樹的每個節點代表一位家庭成員,每個節點的值代表他她所擁有的手機數量,戶主作為這棵樹的根。戶主想要找到同一代家庭成員所擁有手機的最大數量。屬於樹中同一級的所有成員都被視為同一代。

編寫一個算法,求出同一代家庭成員所擁有手機的最大數量。

輸入

函數/方法的輸入包含一個參數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;
    }
}

百度2018春招開發測試工程師編程題題解