-
Notifications
You must be signed in to change notification settings - Fork 956
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ec8ab18
commit 60bf91c
Showing
2 changed files
with
106 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
### 题目描述 | ||
|
||
这是 LeetCode 上的 **[1161. 最大层内元素和](https://leetcode.cn/problems/maximum-level-sum-of-a-binary-tree/solution/by-ac_oier-aemz/)** ,难度为 **中等**。 | ||
|
||
Tag : 「层序遍历」、「BFS」 | ||
|
||
|
||
|
||
给你一个二叉树的根节点 `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$ | ||
|
||
--- | ||
|
||
### 层序遍历 | ||
|
||
根据题意,使用 `BFS` 进行层序遍历即可。 | ||
|
||
每次以「层」为单位进行拓展,统计该层的元素和,维护处理过程中的最大值层数和,以及层深度。 | ||
|
||
Java 代码: | ||
```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 代码: | ||
```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)$ | ||
|
||
--- | ||
|
||
### 最后 | ||
|
||
这是我们「刷穿 LeetCode」系列文章的第 `No.1161` 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。 | ||
|
||
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。 | ||
|
||
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。 | ||
|
||
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。 |