Skip to content

Commit 773edfc

Browse files
committed
feat: add solutions to lc problem: No.0637
No.0637.Average of Levels in Binary Tree
1 parent e481ad1 commit 773edfc

File tree

7 files changed

+544
-161
lines changed

7 files changed

+544
-161
lines changed

solution/0600-0699/0637.Average of Levels in Binary Tree/README.md

+245-53
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

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

48+
**方法一:BFS**
49+
4850
<!-- tabs:start -->
4951

5052
### **Python3**
@@ -59,21 +61,45 @@
5961
# self.left = left
6062
# self.right = right
6163
class Solution:
62-
def averageOfLevels(self, root: TreeNode) -> List[float]:
63-
res = []
64+
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
6465
q = deque([root])
66+
ans = []
6567
while q:
66-
n = len(q)
67-
s = 0
68+
s, n = 0, len(q)
6869
for _ in range(n):
69-
node = q.popleft()
70-
s += node.val
71-
if node.left:
72-
q.append(node.left)
73-
if node.right:
74-
q.append(node.right)
75-
res.append(s / n)
76-
return res
70+
root = q.popleft()
71+
s += root.val
72+
if root.left:
73+
q.append(root.left)
74+
if root.right:
75+
q.append(root.right)
76+
ans.append(s / n)
77+
return ans
78+
```
79+
80+
```python
81+
# Definition for a binary tree node.
82+
# class TreeNode:
83+
# def __init__(self, val=0, left=None, right=None):
84+
# self.val = val
85+
# self.left = left
86+
# self.right = right
87+
class Solution:
88+
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
89+
def dfs(root, i):
90+
if root is None:
91+
return
92+
if len(s) == i:
93+
s.append([root.val, 1])
94+
else:
95+
s[i][0] += root.val
96+
s[i][1] += 1
97+
dfs(root.left, i + 1)
98+
dfs(root.right, i + 1)
99+
100+
s = []
101+
dfs(root, 0)
102+
return [a / b for a, b in s]
77103
```
78104

79105
### **Java**
@@ -98,24 +124,71 @@ class Solution:
98124
*/
99125
class Solution {
100126
public List<Double> averageOfLevels(TreeNode root) {
101-
List<Double> res = new ArrayList<>();
102-
Queue<TreeNode> q = new LinkedList<>();
127+
List<Double> ans = new ArrayList<>();
128+
Deque<TreeNode> q = new ArrayDeque<>();
103129
q.offer(root);
104130
while (!q.isEmpty()) {
105-
double s = 0, n = q.size();
131+
int n = q.size();
132+
long s = 0;
106133
for (int i = 0; i < n; ++i) {
107-
TreeNode node = q.poll();
108-
s += node.val;
109-
if (node.left != null) {
110-
q.offer(node.left);
134+
root = q.pollFirst();
135+
s += root.val;
136+
if (root.left != null) {
137+
q.offer(root.left);
111138
}
112-
if (node.right != null) {
113-
q.offer(node.right);
139+
if (root.right != null) {
140+
q.offer(root.right);
114141
}
115142
}
116-
res.add(s / n);
143+
ans.add(s * 1.0 / n);
144+
}
145+
return ans;
146+
}
147+
}
148+
```
149+
150+
```java
151+
/**
152+
* Definition for a binary tree node.
153+
* public class TreeNode {
154+
* int val;
155+
* TreeNode left;
156+
* TreeNode right;
157+
* TreeNode() {}
158+
* TreeNode(int val) { this.val = val; }
159+
* TreeNode(int val, TreeNode left, TreeNode right) {
160+
* this.val = val;
161+
* this.left = left;
162+
* this.right = right;
163+
* }
164+
* }
165+
*/
166+
class Solution {
167+
private List<Long> s = new ArrayList<>();
168+
private List<Integer> cnt = new ArrayList<>();
169+
170+
public List<Double> averageOfLevels(TreeNode root) {
171+
dfs(root, 0);
172+
List<Double> ans = new ArrayList<>();
173+
for (int i = 0; i < s.size(); ++i) {
174+
ans.add(s.get(i) * 1.0 / cnt.get(i));
117175
}
118-
return res;
176+
return ans;
177+
}
178+
179+
private void dfs(TreeNode root, int i) {
180+
if (root == null) {
181+
return;
182+
}
183+
if (s.size() == i) {
184+
s.add((long) root.val);
185+
cnt.add(1);
186+
} else {
187+
s.set(i, s.get(i) + root.val);
188+
cnt.set(i, cnt.get(i) + 1);
189+
}
190+
dfs(root.left, i + 1);
191+
dfs(root.right, i + 1);
119192
}
120193
}
121194
```
@@ -136,24 +209,63 @@ class Solution {
136209
* @return {number[]}
137210
*/
138211
var averageOfLevels = function (root) {
139-
let res = [];
140-
let queue = [root];
141-
while (queue.length > 0) {
142-
n = queue.length;
143-
let sum = 0;
144-
for (let i = 0; i < n; i++) {
145-
let node = queue.shift();
146-
sum += node.val;
147-
if (node.left) {
148-
queue.push(node.left);
212+
let q = [root];
213+
let ans = [];
214+
while (q.length) {
215+
const n = q.length;
216+
let s = 0;
217+
for (let i = 0; i < n; ++i) {
218+
root = q.shift();
219+
s += root.val;
220+
if (root.left) {
221+
q.push(root.left);
149222
}
150-
if (node.right) {
151-
queue.push(node.right);
223+
if (root.right) {
224+
q.push(root.right);
152225
}
153226
}
154-
res.push(sum / n);
227+
ans.push(s / n);
155228
}
156-
return res;
229+
return ans;
230+
};
231+
```
232+
233+
```js
234+
/**
235+
* Definition for a binary tree node.
236+
* function TreeNode(val, left, right) {
237+
* this.val = (val===undefined ? 0 : val)
238+
* this.left = (left===undefined ? null : left)
239+
* this.right = (right===undefined ? null : right)
240+
* }
241+
*/
242+
/**
243+
* @param {TreeNode} root
244+
* @return {number[]}
245+
*/
246+
var averageOfLevels = function(root) {
247+
let s = [];
248+
let cnt = [];
249+
function dfs(root, i) {
250+
if (!root) {
251+
return;
252+
}
253+
if (s.length == i) {
254+
s.push(root.val);
255+
cnt.push(1);
256+
} else {
257+
s[i] += root.val;
258+
cnt[i]++;
259+
}
260+
dfs(root.left, i + 1);
261+
dfs(root.right, i + 1);
262+
}
263+
dfs(root, 0);
264+
let ans = [];
265+
for (let i = 0; i < s.length; ++i) {
266+
ans.push(s[i] / cnt[i]);
267+
}
268+
return ans;
157269
};
158270
```
159271

@@ -170,22 +282,58 @@ var averageOfLevels = function (root) {
170282
*/
171283
func averageOfLevels(root *TreeNode) []float64 {
172284
q := []*TreeNode{root}
173-
var ans []float64
285+
ans := []float64{}
174286
for len(q) > 0 {
175287
n := len(q)
176-
var sum int
288+
s := 0
177289
for i := 0; i < n; i++ {
178-
node := q[0]
290+
root = q[0]
179291
q = q[1:]
180-
sum += node.Val
181-
if node.Left != nil {
182-
q = append(q, node.Left)
292+
s += root.Val
293+
if root.Left != nil {
294+
q = append(q, root.Left)
183295
}
184-
if node.Right != nil {
185-
q = append(q, node.Right)
296+
if root.Right != nil {
297+
q = append(q, root.Right)
186298
}
187299
}
188-
ans = append(ans, float64(sum)/float64(n))
300+
ans = append(ans, float64(s)/float64(n))
301+
}
302+
return ans
303+
}
304+
```
305+
306+
```go
307+
/**
308+
* Definition for a binary tree node.
309+
* type TreeNode struct {
310+
* Val int
311+
* Left *TreeNode
312+
* Right *TreeNode
313+
* }
314+
*/
315+
func averageOfLevels(root *TreeNode) []float64 {
316+
s := []int{}
317+
cnt := []int{}
318+
var dfs func(root *TreeNode, i int)
319+
dfs = func(root *TreeNode, i int) {
320+
if root == nil {
321+
return
322+
}
323+
if len(s) == i {
324+
s = append(s, root.Val)
325+
cnt = append(cnt, 1)
326+
} else {
327+
s[i] += root.Val
328+
cnt[i]++
329+
}
330+
dfs(root.Left, i+1)
331+
dfs(root.Right, i+1)
332+
}
333+
dfs(root, 0)
334+
ans := []float64{}
335+
for i, t := range s {
336+
ans = append(ans, float64(t)/float64(cnt[i]))
189337
}
190338
return ans
191339
}
@@ -208,25 +356,69 @@ func averageOfLevels(root *TreeNode) []float64 {
208356
class Solution {
209357
public:
210358
vector<double> averageOfLevels(TreeNode* root) {
211-
queue<TreeNode*> q({root});
359+
queue<TreeNode*> q {{root}};
212360
vector<double> ans;
213361
while (!q.empty()) {
214362
int n = q.size();
215-
long long sum = 0;
363+
long long s = 0;
216364
for (int i = 0; i < n; ++i) {
217-
TreeNode* node = q.front();
365+
root = q.front();
218366
q.pop();
219-
sum += node->val;
220-
if (node->left != nullptr) q.push(node->left);
221-
if (node->right != nullptr) q.push(node->right);
367+
s += root->val;
368+
if (root->left) q.push(root->left);
369+
if (root->right) q.push(root->right);
222370
}
223-
ans.emplace_back(sum * 1.0 / n);
371+
ans.push_back(s * 1.0 / n);
224372
}
225373
return ans;
226374
}
227375
};
228376
```
229377
378+
```cpp
379+
/**
380+
* Definition for a binary tree node.
381+
* struct TreeNode {
382+
* int val;
383+
* TreeNode *left;
384+
* TreeNode *right;
385+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
386+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
387+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
388+
* };
389+
*/
390+
391+
using ll = long long;
392+
393+
class Solution {
394+
public:
395+
vector<ll> s;
396+
vector<int> cnt;
397+
398+
vector<double> averageOfLevels(TreeNode* root) {
399+
dfs(root, 0);
400+
vector<double> ans(s.size());
401+
for (int i = 0; i < s.size(); ++i) {
402+
ans[i] = (s[i] * 1.0 / cnt[i]);
403+
}
404+
return ans;
405+
}
406+
407+
void dfs(TreeNode* root, int i) {
408+
if (!root) return;
409+
if (s.size() == i) {
410+
s.push_back(root->val);
411+
cnt.push_back(1);
412+
} else {
413+
s[i] += root->val;
414+
cnt[i]++;
415+
}
416+
dfs(root->left, i + 1);
417+
dfs(root->right, i + 1);
418+
}
419+
};
420+
```
421+
230422
### **Rust**
231423

232424
```rust

0 commit comments

Comments
 (0)