百度2018春招開發測試工程師編程題題解
阿新 • • 發佈:2018-04-19
開發 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>(); } }
思路
按層次遍歷二叉樹
訪問根節點,並將根節點入隊。
當隊列不空的時候,重復以下操作。
- 彈出一個元素。作為當前的根節點。
- 如果根節點有孩子,訪問孩子節點,並將孩子節點入隊。
代碼實現
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春招開發測試工程師編程題題解