(Java)leetcode-1302 Deepest Leaves Sum(層數最深葉子節點的和)

題目描述

給你一棵二叉樹,請你返回層數最深的葉子節點的和。
示例:
在這裏插入圖片描述
輸入: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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章