use std::collections::VecDeque; #[derive(Debug)] struct TreeNode { val: i32, left: Option<Box<TreeNode>>, right: Option<Box<TreeNode>>, } fn zigzag_level_order(root: Option<Box<TreeNode>>) -> Vec<Vec<i32>> { let mut results = Vec::new(); if root.is_none() { return results; } let mut current_level = VecDeque::new(); current_level.push_back(root.unwrap()); let mut left_to_right = true; while !current_level.is_empty() { let mut level_size = current_level.len(); let mut level_nodes = Vec::new(); let mut next_level = VecDeque::new(); while level_size > 0 { let node = if left_to_right { current_level.pop_front().unwrap() } else { current_level.pop_back().unwrap() }; level_nodes.push(node.val); if left_to_right { if let Some(left) = node.left { next_level.push_back(left); } if let Some(right) = node.right { next_level.push_back(right); } } else { if let Some(right) = node.right { next_level.push_front(right); } if let Some(left) = node.left { next_level.push_front(left); } } level_size -= 1; } results.push(level_nodes); current_level = next_level; left_to_right = !left_to_right; } results } fn main() { let root = Some(Box::new(TreeNode { val: 1, left: Some(Box::new(TreeNode { val: 2, left: Some(Box::new(TreeNode { val: 4, left: None, right: None })), right: Some(Box::new(TreeNode { val: 5, left: None, right: None })), })), right: Some(Box::new(TreeNode { val: 3, left: Some(Box::new(TreeNode { val: 6, left: None, right: None })), right: Some(Box::new(TreeNode { val: 7, left: None, right: None })), })), })); let result = zigzag_level_order(root); println!("{:?}", result); }
The traversal starts left to right on level 1, then right to left on level 2, then left to right on level 3, and so on.
So level 1: [1]
Level 2: [3, 2] (reverse order)
Level 3: [4, 5, 6, 7]
A deque (double-ended queue) allows adding and removing nodes from both front and back, which is essential to alternate the traversal direction at each level without extra overhead.
fn zigzag_level_order(root: Option<Box<TreeNode>>) -> Vec<Vec<i32>> {
let mut results = Vec::new();
if root.is_none() {
return results;
}
let mut current_level = VecDeque::new();
current_level.push_back(root.unwrap());
let mut left_to_right = true;
while !current_level.is_empty() {
let mut level_size = current_level.len();
let mut level_nodes = Vec::new();
let mut next_level = VecDeque::new();
while level_size > 0 {
let node = if left_to_right {
current_level.pop_front().unwrap()
} else {
current_level.pop_back().unwrap()
};
level_nodes.push(node.val);
// Bug: next_level is not defined or updated
if left_to_right {
if let Some(left) = node.left {
next_level.push_back(left);
}
if let Some(right) = node.right {
next_level.push_back(right);
}
} else {
if let Some(right) = node.right {
next_level.push_front(right);
}
if let Some(left) = node.left {
next_level.push_front(left);
}
}
level_size -= 1;
}
results.push(level_nodes);
current_level = next_level;
left_to_right = !left_to_right;
}
results
}The variable 'next_level' is used but never declared or initialized, causing a compile-time error.
Level 1: left to right → [10]
Level 2: right to left → [15, 5]
Level 3: left to right → [3, 7, 18]
use std::collections::VecDeque; #[derive(Debug)] struct TreeNode { val: i32, left: Option<Box<TreeNode>>, right: Option<Box<TreeNode>>, } fn zigzag_level_order(root: Option<Box<TreeNode>>) -> Vec<Vec<i32>> { let mut results = Vec::new(); if root.is_none() { return results; } let mut current_level = VecDeque::new(); current_level.push_back(root.unwrap()); let mut left_to_right = true; while !current_level.is_empty() { let mut level_size = current_level.len(); let mut level_nodes = Vec::new(); let mut next_level = VecDeque::new(); while level_size > 0 { let node = if left_to_right { current_level.pop_front().unwrap() } else { current_level.pop_back().unwrap() }; level_nodes.push(node.val); if left_to_right { if let Some(left) = node.left { next_level.push_back(left); } if let Some(right) = node.right { next_level.push_back(right); } } else { if let Some(right) = node.right { next_level.push_front(right); } if let Some(left) = node.left { next_level.push_front(left); } } level_size -= 1; } results.push(level_nodes); current_level = next_level; left_to_right = !left_to_right; } results } fn main() { let root = Some(Box::new(TreeNode { val: 42, left: None, right: None })); let result = zigzag_level_order(root); println!("{:?}", result); }
Since there is only one node, the traversal returns a single level with that node's value.
