Skip to content

Commit 2bd295c

Browse files
committed
Added Average of Levels in Binary Tree
1 parent 7d283c3 commit 2bd295c

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use crate::tree_node::TreeNode;
2+
use crate::tree_node_additions::TreeNodeAdditions;
3+
use std::cell::RefCell;
4+
use std::collections::VecDeque;
5+
use std::rc::Rc;
6+
7+
/// Given the `root` of a binary tree, return the average value of the nodes
8+
/// on each level in the form of an array. Answers within `10^-5` of the actual
9+
/// answer will be accepted.
10+
struct Solution;
11+
12+
impl Solution {
13+
14+
pub fn average_of_levels(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<f64> {
15+
let mut result = Vec::new();
16+
let mut queue = VecDeque::new();
17+
18+
queue.push_back(root.clone());
19+
while !queue.is_empty() {
20+
let n = queue.len();
21+
let mut sum = 0.0;
22+
for _ in 0..n {
23+
let item = queue.pop_front().unwrap();
24+
match item {
25+
Some(rc) => {
26+
let node = rc.borrow();
27+
sum += node.val as f64;
28+
if node.left.is_some() {
29+
queue.push_back(node.left.clone());
30+
}
31+
if node.right.is_some() {
32+
queue.push_back(node.right.clone());
33+
}
34+
}
35+
None => { }
36+
}
37+
}
38+
let average = sum / n as f64;
39+
result.push(average);
40+
}
41+
42+
result
43+
}
44+
45+
}
46+
47+
#[cfg(test)]
48+
mod tests {
49+
use crate::serialize_and_deserialize_binary_tree::Codec;
50+
use super::Solution;
51+
52+
#[test]
53+
fn example_1() {
54+
let data = "[3,9,20,null,null,15,7]".to_string();
55+
let codec = Codec::new();
56+
let root = codec.deserialize(data);
57+
let result = Solution::average_of_levels(root);
58+
assert_eq!(result, vec![3.00000,14.50000,11.00000]);
59+
}
60+
61+
#[test]
62+
fn example_2() {
63+
let data = "[3,9,20,15,7]".to_string();
64+
let codec = Codec::new();
65+
let root = codec.deserialize(data);
66+
let result = Solution::average_of_levels(root);
67+
assert_eq!(result, vec![3.00000,14.50000,11.00000]);
68+
}
69+
70+
}

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ pub mod number_of_provinces; // 547
157157

158158
pub mod reverse_words_in_a_string_iii; // 557
159159

160+
pub mod average_of_levels_in_binary_tree; // 637
161+
160162
pub mod find_k_closest_elements; // 658
161163

162164
pub mod top_k_frequent_words; // 692

0 commit comments

Comments
 (0)