Mental Model
Flip the tree so left and right children swap places at every node.
Analogy: Imagine holding a tree in front of a mirror; the left side becomes the right side and vice versa.
1 / \ 2 3 / \ 4 5
1 / \ 2 3 / \ 4 5
1 / \ 3 2 / \ 5 4
1 / \ 3 2 / \ 5 4
1 / \ 3 2 / \ 5 4
1 / \ 3 2 / \ 5 4
1 / \ 3 2 / \ 5 4
use std::rc::Rc; use std::cell::RefCell; #[derive(Debug, Clone)] struct TreeNode { val: i32, left: Option<Rc<RefCell<TreeNode>>>, right: Option<Rc<RefCell<TreeNode>>>, } impl TreeNode { fn new(val: i32) -> Rc<RefCell<TreeNode>> { Rc::new(RefCell::new(TreeNode { val, left: None, right: None })) } } fn mirror_tree(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> { if let Some(node_rc) = root { let mut node = node_rc.borrow_mut(); // Swap left and right children let temp = node.left.take(); node.left = mirror_tree(node.right.take()); node.right = mirror_tree(temp); drop(node); // release borrow Some(node_rc) } else { None } } fn print_tree(root: &Option<Rc<RefCell<TreeNode>>>, prefix: String, is_left: bool) { if let Some(node_rc) = root { let node = node_rc.borrow(); println!("{}{}{}", prefix, if is_left {"├── "} else {"└── "}, node.val); let new_prefix = format!("{}{}", prefix, if is_left {"│ "} else {" "}); print_tree(&node.left, new_prefix.clone(), true); print_tree(&node.right, new_prefix, false); } } fn main() { // Build tree: // 1 // / \ // 2 3 // / \ // 4 5 let root = TreeNode::new(1); { let mut r = root.borrow_mut(); r.left = Some(TreeNode::new(2)); r.right = Some(TreeNode::new(3)); } { let left = root.borrow().left.clone().unwrap(); let mut l = left.borrow_mut(); l.left = Some(TreeNode::new(4)); } { let right = root.borrow().right.clone().unwrap(); let mut r = right.borrow_mut(); r.right = Some(TreeNode::new(5)); } println!("Original tree:"); print_tree(&Some(root.clone()), String::new(), false); let mirrored = mirror_tree(Some(root)); println!("\nMirrored tree:"); print_tree(&mirrored, String::new(), false); }
if let Some(node_rc) = root {let mut node = node_rc.borrow_mut();let temp = node.left.take();node.left = mirror_tree(node.right.take());node.right = mirror_tree(temp);Some(node_rc)if let Some(node_rc) = root {if let Some(node_rc) = root {node.left = mirror_tree(node.right.take());
take() to avoid borrowing issues.take() to temporarily hold left child, then swaps left and right correctly. node.left = node.right; node.right = node.left; incorrectly assigns right to left and then left to right without temp, causing both to be same.take() to swap safely [OK]take() to swap children safely in Rust [OK]take() causing borrow errorsstruct Node {
val: i32,
left: Option,
right: Option,
}
fn mirror(node: &mut Option) {
if let Some(n) = node {
mirror(&mut n.left);
mirror(&mut n.right);
let temp = n.left.take();
n.left = n.right.take();
n.right = temp;
}
}
// Tree before mirror:
// 1
// / \
// 2 3
// / \
// 4 5
// In-order traversal after mirror?fn mirror(node: &mut Option) {
if let Some(n) = node {
mirror(&mut n.left);
mirror(&mut n.right);
n.left = n.right.take();
n.right = n.left.take();
}
}n.left = n.right.take() first, which moves right child to left and sets right to None. Then n.right = n.left.take() tries to take from left, which is now the old right child, but after first take, left is already moved, so it becomes None.Pass the test and this pattern moves unknown