Skip to content

Commit 0ce6938

Browse files
committed
feat: add solutions to lc problem: No.1161
No.1161.Maximum Level Sum of a Binary Tree
1 parent 8a9d137 commit 0ce6938

File tree

6 files changed

+430
-149
lines changed

6 files changed

+430
-149
lines changed

solution/1100-1199/1161.Maximum Level Sum of a Binary Tree/README.md

+195-50
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,14 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49+
**方法一:BFS**
50+
51+
BFS 层次遍历,求每一层的节点和,找出节点和最大的层,若有多个层的节点和最大,则返回最小的层。
52+
53+
**方法二:DFS**
54+
55+
56+
4957
<!-- tabs:start -->
5058

5159
### **Python3**
@@ -60,24 +68,48 @@
6068
# self.left = left
6169
# self.right = right
6270
class Solution:
63-
def maxLevelSum(self, root: TreeNode) -> int:
64-
ans = (float('-inf'), 0)
71+
def maxLevelSum(self, root: Optional[TreeNode]) -> int:
6572
q = deque([root])
66-
l = 0
73+
mx = -inf
74+
i = 0
6775
while q:
68-
l += 1
69-
n = len(q)
76+
i += 1
7077
s = 0
71-
for _ in range(n):
78+
for _ in range(len(q)):
7279
node = q.popleft()
7380
s += node.val
7481
if node.left:
7582
q.append(node.left)
7683
if node.right:
7784
q.append(node.right)
78-
if s > ans[0]:
79-
ans = (s, l)
80-
return ans[1]
85+
if mx < s:
86+
mx = s
87+
ans = i
88+
return ans
89+
```
90+
91+
```python
92+
# Definition for a binary tree node.
93+
# class TreeNode:
94+
# def __init__(self, val=0, left=None, right=None):
95+
# self.val = val
96+
# self.left = left
97+
# self.right = right
98+
class Solution:
99+
def maxLevelSum(self, root: Optional[TreeNode]) -> int:
100+
def dfs(node, i):
101+
if node is None:
102+
return
103+
if i == len(s):
104+
s.append(node.val)
105+
else:
106+
s[i] += node.val
107+
dfs(node.left, i + 1)
108+
dfs(node.right, i + 1)
109+
110+
s = []
111+
dfs(root, 0)
112+
return s.index(max(s)) + 1
81113
```
82114

83115
### **Java**
@@ -101,34 +133,80 @@ class Solution:
101133
* }
102134
*/
103135
class Solution {
104-
105136
public int maxLevelSum(TreeNode root) {
106-
int[] ans = new int[] { Integer.MIN_VALUE, 0 };
107-
int l = 0;
108-
Deque<TreeNode> q = new LinkedList<>();
109-
q.offerLast(root);
137+
Deque<TreeNode> q = new ArrayDeque<>();
138+
q.offer(root);
139+
int mx = Integer.MIN_VALUE;
140+
int i = 0;
141+
int ans = 0;
110142
while (!q.isEmpty()) {
111-
++l;
143+
++i;
112144
int s = 0;
113-
for (int i = q.size(); i > 0; --i) {
145+
for (int n = q.size(); n > 0; --n) {
114146
TreeNode node = q.pollFirst();
115147
s += node.val;
116148
if (node.left != null) {
117-
q.offerLast(node.left);
149+
q.offer(node.left);
118150
}
119151
if (node.right != null) {
120-
q.offerLast(node.right);
152+
q.offer(node.right);
121153
}
122154
}
123-
if (s > ans[0]) {
124-
ans[0] = s;
125-
ans[1] = l;
155+
if (mx < s) {
156+
mx = s;
157+
ans = i;
126158
}
127159
}
128-
return ans[1];
160+
return ans;
129161
}
130162
}
163+
```
131164

165+
```java
166+
/**
167+
* Definition for a binary tree node.
168+
* public class TreeNode {
169+
* int val;
170+
* TreeNode left;
171+
* TreeNode right;
172+
* TreeNode() {}
173+
* TreeNode(int val) { this.val = val; }
174+
* TreeNode(int val, TreeNode left, TreeNode right) {
175+
* this.val = val;
176+
* this.left = left;
177+
* this.right = right;
178+
* }
179+
* }
180+
*/
181+
class Solution {
182+
private List<Integer> s = new ArrayList<>();
183+
184+
public int maxLevelSum(TreeNode root) {
185+
dfs(root, 0);
186+
int mx = Integer.MIN_VALUE;
187+
int ans = 0;
188+
for (int i = 0; i < s.size(); ++i) {
189+
if (mx < s.get(i)) {
190+
mx = s.get(i);
191+
ans = i + 1;
192+
}
193+
}
194+
return ans;
195+
}
196+
197+
private void dfs(TreeNode root, int i) {
198+
if (root == null) {
199+
return;
200+
}
201+
if (i == s.size()) {
202+
s.add(root.val);
203+
} else {
204+
s.set(i, s.get(i) + root.val);
205+
}
206+
dfs(root.left, i + 1);
207+
dfs(root.right, i + 1);
208+
}
209+
}
132210
```
133211

134212
### **C++**
@@ -148,29 +226,58 @@ class Solution {
148226
class Solution {
149227
public:
150228
int maxLevelSum(TreeNode* root) {
151-
vector<int> ans(2);
152-
ans[0] = INT_MIN;
153229
queue<TreeNode*> q{{root}};
154-
int l = 0;
230+
int mx = INT_MIN;
231+
int ans = 0;
232+
int i = 0;
155233
while (!q.empty())
156234
{
157-
++l;
235+
++i;
158236
int s = 0;
159-
for (int i = q.size(); i > 0; --i)
237+
for (int n = q.size(); n; --n)
160238
{
161-
TreeNode* node = q.front();
239+
root = q.front();
162240
q.pop();
163-
s += node->val;
164-
if (node->left) q.push(node->left);
165-
if (node->right) q.push(node->right);
166-
}
167-
if (s > ans[0])
168-
{
169-
ans[0] = s;
170-
ans[1] = l;
241+
s += root->val;
242+
if (root->left) q.push(root->left);
243+
if (root->right) q.push(root->right);
171244
}
245+
if (mx < s) mx = s, ans = i;
172246
}
173-
return ans[1];
247+
return ans;
248+
}
249+
};
250+
```
251+
252+
```cpp
253+
/**
254+
* Definition for a binary tree node.
255+
* struct TreeNode {
256+
* int val;
257+
* TreeNode *left;
258+
* TreeNode *right;
259+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
260+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
261+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
262+
* };
263+
*/
264+
class Solution {
265+
public:
266+
int maxLevelSum(TreeNode* root) {
267+
vector<int> s;
268+
dfs(root, 0, s);
269+
int mx = INT_MIN;
270+
int ans = 0;
271+
for (int i = 0; i < s.size(); ++i) if (mx < s[i]) mx = s[i], ans = i + 1;
272+
return ans;
273+
}
274+
275+
void dfs(TreeNode* root, int i, vector<int>& s) {
276+
if (!root) return;
277+
if (s.size() == i) s.push_back(root->val);
278+
else s[i] += root->val;
279+
dfs(root->left, i + 1, s);
280+
dfs(root->right, i + 1, s);
174281
}
175282
};
176283
```
@@ -187,28 +294,66 @@ public:
187294
* }
188295
*/
189296
func maxLevelSum(root *TreeNode) int {
190-
ans := [2]int{math.MinInt32, 0}
191297
q := []*TreeNode{root}
192-
l := 0
298+
mx := -0x3f3f3f3f
299+
i := 0
300+
ans := 0
193301
for len(q) > 0 {
194-
l++
302+
i++
195303
s := 0
196-
for i := len(q); i > 0; i-- {
197-
node := q[0]
304+
for n := len(q); n > 0; n-- {
305+
root = q[0]
198306
q = q[1:]
199-
s += node.Val
200-
if node.Left != nil {
201-
q = append(q, node.Left)
307+
s += root.Val
308+
if root.Left != nil {
309+
q = append(q, root.Left)
202310
}
203-
if node.Right != nil {
204-
q = append(q, node.Right)
311+
if root.Right != nil {
312+
q = append(q, root.Right)
205313
}
206314
}
207-
if s > ans[0] {
208-
ans = [2]int{s, l}
315+
if mx < s {
316+
mx = s
317+
ans = i
318+
}
319+
}
320+
return ans
321+
}
322+
```
323+
324+
```go
325+
/**
326+
* Definition for a binary tree node.
327+
* type TreeNode struct {
328+
* Val int
329+
* Left *TreeNode
330+
* Right *TreeNode
331+
* }
332+
*/
333+
func maxLevelSum(root *TreeNode) int {
334+
s := []int{}
335+
var dfs func(*TreeNode, int)
336+
dfs = func(root *TreeNode, i int) {
337+
if root == nil {
338+
return
339+
}
340+
if len(s) == i {
341+
s = append(s, root.Val)
342+
} else {
343+
s[i] += root.Val
344+
}
345+
dfs(root.Left, i+1)
346+
dfs(root.Right, i+1)
347+
}
348+
dfs(root, 0)
349+
ans, mx := 0, -0x3f3f3f3f
350+
for i, v := range s {
351+
if mx < v {
352+
mx = v
353+
ans = i + 1
209354
}
210355
}
211-
return ans[1]
356+
return ans
212357
}
213358
```
214359

0 commit comments

Comments
 (0)