1161. 最大层内元素和 : 层序遍历运用题

965 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

题目描述

这是 LeetCode 上的 1161. 最大层内元素和 ,难度为 中等

Tag : 「层序遍历」、「BFS」

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

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

示例 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,104][1, 10^4]范围内
  • 105 <=Node.val<=105-10^5 <= Node.val <= 10^5

层序遍历

根据题意,使用 BFS 进行层序遍历即可。

每次以「层」为单位进行拓展,统计该层的元素和,维护处理过程中的最大值层数和,以及层深度。

Java 代码:

class Solution {
    public int maxLevelSum(TreeNode root) {
        Deque<TreeNode> d = new ArrayDeque<>();
        int max = -0x3f3f3f3f, depth = 1, ans = 0;
        d.addLast(root);
        while (!d.isEmpty()) {
            int sz = d.size(), cur = 0;
            while (sz-- > 0) {
                TreeNode t = d.pollFirst();
                if (t.left != null) d.addLast(t.left);
                if (t.right != null) d.addLast(t.right);
                cur += t.val;
            }
            if (cur > max) {
                max = cur; ans = depth;
            }
            depth++;
        }
        return ans;
    }
}

TypeScript 代码:

function maxLevelSum(root: TreeNode | null): number {
    const d: TreeNode[] = new Array<TreeNode>()
    let he = 0, ta = 0
    d[ta++] = root
    let max = -0x3f3f3f3f, depth = 1, ans = 0
    while (he < ta) {
        let sz = ta - he, cur = 0
        while (sz-- > 0) {
            const t = d[he++]
            if (t.left != null) d[ta++] = t.left
            if (t.right != null) d[ta++] = t.right
            cur += t.val
        }
        if (cur > max) {
            max = cur; ans = depth
        }
        depth++
    }
    return ans
};
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)

最后

这是我们「刷穿 LeetCode」系列文章的第 No.1161 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉