Skip to content

Commit 26c3859

Browse files
committed
solve #103
1 parent f3acc6d commit 26c3859

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,4 @@ mod n0099_recover_binary_search_tree;
103103
mod n0100_same_tree;
104104
mod n0101_symmetric_tree;
105105
mod n0102_binary_tree_level_order_traversal;
106+
mod n0103_binary_tree_zigzag_level_order_traversal;
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/**
2+
* [103] Binary Tree Zigzag Level Order Traversal
3+
*
4+
* Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
5+
*
6+
*
7+
* For example:<br />
8+
* Given binary tree [3,9,20,null,null,15,7],<br />
9+
*
10+
* 3
11+
* / \
12+
* 9 20
13+
* / \
14+
* 15 7
15+
*
16+
*
17+
*
18+
* return its zigzag level order traversal as:<br />
19+
*
20+
* [
21+
* [3],
22+
* [20,9],
23+
* [15,7]
24+
* ]
25+
*
26+
*
27+
*/
28+
pub struct Solution {}
29+
use super::util::tree::{TreeNode, to_tree};
30+
31+
// submission codes start here
32+
33+
use std::rc::Rc;
34+
use std::cell::RefCell;
35+
use std::collections::VecDeque;
36+
impl Solution {
37+
pub fn zigzag_level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
38+
let mut res = Vec::new();
39+
let mut current_level = 0;
40+
if root.is_none() { return res }
41+
let mut deq = VecDeque::new();
42+
deq.push_back((0, root.clone()));
43+
let mut vec = Vec::new();
44+
while !deq.is_empty() {
45+
if let Some((level, Some(node))) = deq.pop_front() {
46+
deq.push_back((level + 1, node.borrow().left.clone()));
47+
deq.push_back((level + 1, node.borrow().right.clone()));
48+
if level > current_level {
49+
if current_level % 2 == 1 {
50+
vec.reverse();
51+
}
52+
res.push(vec);
53+
vec = Vec::new();
54+
current_level = level;
55+
}
56+
vec.push(node.borrow().val);
57+
}
58+
}
59+
if !vec.is_empty() {
60+
if current_level % 2 == 1 {
61+
vec.reverse();
62+
}
63+
res.push(vec)
64+
}
65+
res
66+
}
67+
}
68+
69+
// submission codes end
70+
71+
#[cfg(test)]
72+
mod tests {
73+
use super::*;
74+
75+
#[test]
76+
fn test_103() {
77+
assert_eq!(
78+
Solution::zigzag_level_order(tree![3,9,20,null,null,15,7]),
79+
vec![
80+
vec![3],
81+
vec![20,9],
82+
vec![15,7]
83+
]
84+
);
85+
}
86+
}

0 commit comments

Comments
 (0)