LeetCode C++ 1302. Deepest Leaves Sum【Tree/BFS/DFS】中等

memcpy0發表於2020-11-27

Given a binary tree, return the sum of values of its deepest leaves.

Example 1:
在這裡插入圖片描述

Input: root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
Output: 15

Constraints:

  • The number of nodes in the tree is between 1 and 10^4.
  • The value of nodes is between 1 and 100.

題意:給定一棵二叉樹,返回層數最深的葉子節點的和。


解法1 BFS

計算每一層中可能的葉子節點的和,最後一層即為所求結果:

class Solution {
public:
    int deepestLeavesSum(TreeNode* root) {
        if (root == nullptr) return 0;
        int ans = 0;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            int size = q.size(), leavesSum = 0;
            for (int i = 0; i < size; ++i) {
                TreeNode *t = q.front(); q.pop(); //其實不必額外判斷是否是葉子節點; 最後一層無疑都是葉子節點
                if (!t->left && !t->right) { leavesSum += t->val; continue; } 
                if (t->left) q.push(t->left);
                if (t->right) q.push(t->right);
            }
            ans = leavesSum;
        }
        return ans;
    }
};

效率如下:

執行用時:64 ms, 在所有 C++ 提交中擊敗了90.93% 的使用者
記憶體消耗:38.8 MB, 在所有 C++ 提交中擊敗了14.18% 的使用者

解法2 DFS

不斷更新最大層數,同時記錄最大層對應的葉子節點值之和:

class Solution {
private:
    int sum = 0, maxLevel = 0;
    void dfs(TreeNode* root, int level) {
        if (root == nullptr) return;
        if (level > maxLevel) {
            maxLevel = level;
            sum = root->val;
        } else if (level == maxLevel) sum += root->val;
        dfs(root->left, level + 1);
        dfs(root->right, level + 1);
    } 
public:
    int deepestLeavesSum(TreeNode* root) { 
        dfs(root, 0);
        return sum;
    }
};

執行結果如下:

執行用時:64 ms, 在所有 C++ 提交中擊敗了90.93% 的使用者
記憶體消耗:38.1 MB, 在所有 C++ 提交中擊敗了34.94% 的使用者

相關文章