Mental Model
Visit the left side first, then the middle, then the right side in order.
Analogy: Like reading a book where you first look at the left page, then the center page, then the right page.
2 / \ 1 3 ↑root
2 / \ 1 3 ↑root
2 / \ [1] 3 ↑curr at 1
Output: 1
Output: 1 2
2 / \ 1 [3] ↑curr at 3
Output: 1 2 3
Output: 1 2 3
use std::rc::Rc; use std::cell::RefCell; #[derive(Debug)] 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 inorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) { if let Some(node) = root { // Traverse left subtree inorder_traversal(node.borrow().left.clone()); // Visit root print!("{} ", node.borrow().val); // Traverse right subtree inorder_traversal(node.borrow().right.clone()); } } fn main() { // Build tree: 2 // / \ // 1 3 let root = TreeNode::new(2); root.borrow_mut().left = Some(TreeNode::new(1)); root.borrow_mut().right = Some(TreeNode::new(3)); inorder_traversal(Some(root)); println!(); }
inorder_traversal(node.borrow().left.clone());print!("{} ", node.borrow().val);inorder_traversal(node.borrow().right.clone());if let Some(node) = root {print!("{} ", node.borrow().val);
inorder_traversal(node.borrow().left.clone());
struct TreeNode {
val: i32,
left: Option,
right: Option,
}
fn inorder(node: &Option) {
if let Some(n) = node {
inorder(&n.left);
print!("{} ", n.val);
inorder(&n.right);
}
}
fn main() {
let tree = Some(Box::new(TreeNode {
val: 2,
left: Some(Box::new(TreeNode {
val: 1,
left: None,
right: None,
})),
right: Some(Box::new(TreeNode {
val: 3,
left: None,
right: None,
})),
}));
inorder(&tree);
}fn inorder(node: Option) {
if let Some(n) = node {
inorder(n.left);
print!("{} ", n.val);
inorder(n.right);
}
}Pass the test and this pattern moves unknown