Skip to content

Commit f0cd272

Browse files
committed
102 Binary Tree Level Order Traversal
1 parent 07bcc4d commit f0cd272

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/// @number 102
2+
/// @title Binary Tree Level Order Traversal
3+
/// @url https://leetcode.com/problems/binary-tree-level-order-traversal
4+
/// @difficulty medium
5+
6+
//Given a binary tree, return the level order traversal of its nodes' values. (i
7+
//e, from left to right, level by level).
8+
//
9+
//
10+
//For example:
11+
//Given binary tree [3,9,20,null,null,15,7],
12+
//
13+
// 3
14+
// / \
15+
// 9 20
16+
// / \
17+
// 15 7
18+
//
19+
//
20+
//
21+
//return its level order traversal as:
22+
//
23+
//[
24+
// [3],
25+
// [9,20],
26+
// [15,7]
27+
//]
28+
//
29+
// Related Topics Tree Breadth-first Search
30+
// 👍 2994 👎 74
31+
32+
33+
struct Solution;
34+
35+
#[derive(Debug, PartialEq, Eq)]
36+
pub struct TreeNode {
37+
pub val: i32,
38+
pub left: Option<Rc<RefCell<TreeNode>>>,
39+
pub right: Option<Rc<RefCell<TreeNode>>>,
40+
}
41+
42+
impl TreeNode {
43+
#[inline]
44+
pub fn new(val: i32) -> Self {
45+
TreeNode {
46+
val,
47+
left: None,
48+
right: None,
49+
}
50+
}
51+
}
52+
//leetcode submit region begin(Prohibit modification and deletion)
53+
// Definition for a binary tree node.
54+
55+
use std::rc::Rc;
56+
use std::cell::RefCell;
57+
58+
impl Solution {
59+
pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
60+
let mut vec1 = vec![root];
61+
let mut vec2 = vec![];
62+
63+
let mut looper_flag = true;
64+
65+
let mut ret = vec![];
66+
67+
loop {
68+
if vec1.is_empty() && vec2.is_empty() {
69+
break;
70+
}
71+
let (looper, child_inserter) = if looper_flag {
72+
(&mut vec1, &mut vec2)
73+
} else {
74+
(&mut vec2, &mut vec1)
75+
};
76+
77+
let map: Vec<i32> = looper.iter().filter_map(|node| {
78+
if let Some(node_value) = node {
79+
let node_value_borrowed = node_value.borrow();
80+
child_inserter.push(node_value_borrowed.left.clone());
81+
child_inserter.push(node_value_borrowed.right.clone());
82+
Some(node_value_borrowed.val)
83+
} else {
84+
None
85+
}
86+
}).collect();
87+
88+
if !map.is_empty() {
89+
ret.push(map)
90+
}
91+
92+
looper.clear();
93+
looper_flag = !looper_flag;
94+
}
95+
96+
ret
97+
}
98+
}
99+
//leetcode submit region end(Prohibit modification and deletion)
100+
101+
102+
#[cfg(test)]
103+
mod test {
104+
use crate::binary_tree_level_order_traversal::{Solution, TreeNode};
105+
use std::rc::Rc;
106+
use std::cell::RefCell;
107+
108+
#[test]
109+
fn test() {
110+
let node15 = TreeNode::new(15);
111+
let node7 = TreeNode::new(7);
112+
113+
let mut node20 = TreeNode::new(20);
114+
node20.left = Some(Rc::new(RefCell::new(node15)));
115+
node20.right = Some(Rc::new(RefCell::new(node7)));
116+
117+
let node9 = TreeNode::new(9);
118+
119+
let mut node3 = TreeNode::new(3);
120+
node3.left = Some(Rc::new(RefCell::new(node20)));
121+
node3.right = Some(Rc::new(RefCell::new(node9)));
122+
123+
124+
let vec1 = vec![
125+
vec![3],
126+
vec![9, 20],
127+
vec![15, 7]
128+
];
129+
130+
assert_eq!(vec1, Solution::level_order(Some(Rc::new(RefCell::new(node3)))));
131+
}
132+
133+
#[test]
134+
fn test2() {
135+
let vec1 = vec![
136+
vec![4]
137+
];
138+
assert_eq!(vec1, Solution::level_order(Some(Rc::new(RefCell::new(TreeNode::new(4))))));
139+
}
140+
}

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod binary_tree_level_order_traversal;
12
mod maximum_depth_of_binary_tree;
23
mod invert_binary_tree;
34
mod same_tree;

0 commit comments

Comments
 (0)