侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 471 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【二叉树, DFS】最大层内元素和

GabrielxD
2022-07-31 / 0 评论 / 0 点赞 / 60 阅读 / 476 字 / 正在检测是否收录...

题目

1161. 最大层内元素和


给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

示例 1:

输入:root = [1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。

示例 2:

输入:root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出:2

提示:

  • 树中的节点数在 [1, 10^4]范围内
  • -10^5 <= Node.val <= 10^5

解题

方法一:二叉树 DFS

思路

层序遍历二叉树,把每层加和存入列表集合,然后取列表集合中最大的数的索引中最小的加 1 即可。

代码

class Solution {
    private List<Integer> levelSums = new ArrayList<>();

    public int maxLevelSum(TreeNode root) {
        dfs(root, 0);
        int maxIdx = 0;
        for (int i = 0; i < levelSums.size(); i++) {
            if (levelSums.get(i) > levelSums.get(maxIdx)) maxIdx = i;
        }
        return maxIdx + 1;
    }

    private void dfs(TreeNode node, int level) {
        if (level == levelSums.size()) levelSums.add(node.val);
        else levelSums.set(level, levelSums.get(level) + node.val);
        if (node.left != null) dfs(node.left, level + 1);
        if (node.right != null) dfs(node.right, level + 1);
    }
}
// 关闭同步流
int _ = []() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    return 0;
}();

class Solution {
public:
    vector<int> level_sums;

    void dfs(TreeNode* node, int level) {
        if (level == level_sums.size()) level_sums.push_back(node->val);
        else level_sums[level] += node->val;
        if (node->left) dfs(node->left, level + 1);
        if (node->right) dfs(node->right, level + 1);
    }

    int maxLevelSum(TreeNode* root) {
        dfs(root, 0);
        int max_idx = 0, n = level_sums.size();
        for (int i = 0; i < n; i++) {
            if (level_sums[i] > level_sums[max_idx]) max_idx = i;
        }
        return max_idx + 1;
    }
};
0

评论区