題目描述
給你一棵二叉樹,請你返回層數最深的葉子節點的和。
示例:
輸入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
輸出:15
提示:
樹中節點數目在 1 到 10^4 之間。
每個節點的值在 1 到 100 之間。
思路1:先序遍歷
用一個全局變量來記錄“最深葉子節點的深度”。
前序遍歷,每往下一層,當前深度+1,若是葉子節點,判斷其深度是否能更新到全局變量中(若更新,則sum清零重新統計),並且若當前深度已經爲最深,則將節點值添加到全局sum中。
代碼
class Solution {
int sum = 0;
int maxDepth = 0;
public int deepestLeavesSum(TreeNode root) {
if (root == null) return 0;
travel(root, 0);
return sum;
}
private void travel(TreeNode root, int depth) {
if (root == null) return;
// 葉子節點
if (root.left == null && root.right == null) {
if (depth > maxDepth) {
maxDepth = depth;
sum = 0;
}
if (depth >= maxDepth) {
sum += root.val;
}
}
travel(root.left, depth+1);
travel(root.right, depth+1);
}
}
Runtime: 0 ms, faster than 100.00% of Java online submissions for Deepest Leaves Sum.
Memory Usage: 41.6 MB, less than 39.12% of Java online submissions for Deepest Leaves Sum.
思路2:層序遍歷
層序遍歷,每一層都重新統計res,由於最後一層的節點就是目標節點(層數最深的葉子節點),所以最後一層的res就是我們需要的結果。
代碼
class Solution {
public int deepestLeavesSum(TreeNode root) {
int res = 0, i;
LinkedList<TreeNode> q = new LinkedList<TreeNode>();
q.add(root);
while (!q.isEmpty()) {
for (i = q.size() - 1, res = 0; i >= 0; --i) {
TreeNode node = q.poll();
res += node.val;
if (node.right != null) q.add(node.right);
if (node.left != null) q.add(node.left);
}
}
return res;
}
}
Runtime: 3 ms, faster than 48.23% of Java online submissions for Deepest Leaves Sum.
Memory Usage: 40.5 MB, less than 81.93% of Java online submissions for Deepest Leaves Sum.