46
46
47
47
<!-- 这里可写通用的实现逻辑 -->
48
48
49
+ ** 方法一:BFS**
50
+
51
+ BFS 层次遍历,求每一层的节点和,找出节点和最大的层,若有多个层的节点和最大,则返回最小的层。
52
+
53
+ ** 方法二:DFS**
54
+
55
+
56
+
49
57
<!-- tabs:start -->
50
58
51
59
### ** Python3**
60
68
# self.left = left
61
69
# self.right = right
62
70
class Solution :
63
- def maxLevelSum (self , root : TreeNode) -> int :
64
- ans = (float (' -inf' ), 0 )
71
+ def maxLevelSum (self , root : Optional[TreeNode]) -> int :
65
72
q = deque([root])
66
- l = 0
73
+ mx = - inf
74
+ i = 0
67
75
while q:
68
- l += 1
69
- n = len (q)
76
+ i += 1
70
77
s = 0
71
- for _ in range (n ):
78
+ for _ in range (len (q) ):
72
79
node = q.popleft()
73
80
s += node.val
74
81
if node.left:
75
82
q.append(node.left)
76
83
if node.right:
77
84
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
81
113
```
82
114
83
115
### ** Java**
@@ -101,34 +133,80 @@ class Solution:
101
133
* }
102
134
*/
103
135
class Solution {
104
-
105
136
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 ;
110
142
while (! q. isEmpty()) {
111
- ++ l ;
143
+ ++ i ;
112
144
int s = 0 ;
113
- for (int i = q. size(); i > 0 ; -- i ) {
145
+ for (int n = q. size(); n > 0 ; -- n ) {
114
146
TreeNode node = q. pollFirst();
115
147
s += node. val;
116
148
if (node. left != null ) {
117
- q. offerLast (node. left);
149
+ q. offer (node. left);
118
150
}
119
151
if (node. right != null ) {
120
- q. offerLast (node. right);
152
+ q. offer (node. right);
121
153
}
122
154
}
123
- if (s > ans[ 0 ] ) {
124
- ans[ 0 ] = s;
125
- ans[ 1 ] = l ;
155
+ if (mx < s ) {
156
+ mx = s;
157
+ ans = i ;
126
158
}
127
159
}
128
- return ans[ 1 ] ;
160
+ return ans;
129
161
}
130
162
}
163
+ ```
131
164
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
+ }
132
210
```
133
211
134
212
### ** C++**
@@ -148,29 +226,58 @@ class Solution {
148
226
class Solution {
149
227
public:
150
228
int maxLevelSum(TreeNode* root) {
151
- vector<int > ans(2);
152
- ans[ 0] = INT_MIN;
153
229
queue<TreeNode* > q{{root}};
154
- int l = 0;
230
+ int mx = INT_MIN;
231
+ int ans = 0;
232
+ int i = 0;
155
233
while (!q.empty())
156
234
{
157
- ++l ;
235
+ ++i ;
158
236
int s = 0;
159
- for (int i = q.size(); i > 0 ; --i )
237
+ for (int n = q.size(); n ; --n )
160
238
{
161
- TreeNode * node = q.front();
239
+ root = q.front();
162
240
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);
171
244
}
245
+ if (mx < s) mx = s, ans = i;
172
246
}
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);
174
281
}
175
282
};
176
283
```
@@ -187,28 +294,66 @@ public:
187
294
* }
188
295
*/
189
296
func maxLevelSum (root *TreeNode ) int {
190
- ans := [2]int{math.MinInt32, 0}
191
297
q := []*TreeNode{root}
192
- l := 0
298
+ mx := -0x3f3f3f3f
299
+ i := 0
300
+ ans := 0
193
301
for len (q) > 0 {
194
- l ++
302
+ i ++
195
303
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 ]
198
306
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 )
202
310
}
203
- if node .Right != nil {
204
- q = append(q, node .Right)
311
+ if root .Right != nil {
312
+ q = append (q, root .Right )
205
313
}
206
314
}
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
209
354
}
210
355
}
211
- return ans[1]
356
+ return ans
212
357
}
213
358
```
214
359
0 commit comments