Concept Flow - Tree Traversal Inorder Left Root Right
Start at root node
Traverse left subtree
Visit current node (root)
Traverse right subtree
End
Inorder traversal visits the left subtree first, then the root node, and finally the right subtree.
fn inorder(node: Option<&Box<TreeNode>>) {
if let Some(n) = node {
inorder(n.left.as_ref());
println!("{}", n.val);
inorder(n.right.as_ref());
}
}| Step | Operation | Node Visited | Action | Tree State (Visual) |
|---|---|---|---|---|
| 1 | Start at root | 1 | Traverse left subtree | 1 / \ 2 3 |
| 2 | Traverse left subtree | 2 | Traverse left subtree | 1 / \ 2 3 / 4 |
| 3 | Traverse left subtree | 4 | Traverse left subtree (None) | 1 / \ 2 3 / 4 |
| 4 | Left subtree None | None | Return | 1 / \ 2 3 / 4 |
| 5 | Visit node | 4 | Print 4 | 1 / \ 2 3 / 4 |
| 6 | Traverse right subtree | 4 | Traverse right subtree (None) | 1 / \ 2 3 / 4 |
| 7 | Right subtree None | None | Return | 1 / \ 2 3 / 4 |
| 8 | Return to node | 2 | Print 2 | 1 / \ 2 3 / 4 |
| 9 | Traverse right subtree | 2 | Traverse right subtree (None) | 1 / \ 2 3 / 4 |
| 10 | Right subtree None | None | Return | 1 / \ 2 3 / 4 |
| 11 | Return to root | 1 | Print 1 | 1 / \ 2 3 / 4 |
| 12 | Traverse right subtree | 1 | Traverse right subtree | 1 / \ 2 3 / 4 \ 5 |
| 13 | Traverse left subtree | 3 | Traverse left subtree (None) | 1 / \ 2 3 / 4 \ 5 |
| 14 | Left subtree None | None | Return | 1 / \ 2 3 / 4 \ 5 |
| 15 | Visit node | 3 | Print 3 | 1 / \ 2 3 / 4 \ 5 |
| 16 | Traverse right subtree | 3 | Traverse right subtree | 1 / \ 2 3 / 4 \ 5 |
| 17 | Traverse left subtree | 5 | Traverse left subtree (None) | 1 / \ 2 3 / 4 \ 5 |
| 18 | Left subtree None | None | Return | 1 / \ 2 3 / 4 \ 5 |
| 19 | Visit node | 5 | Print 5 | 1 / \ 2 3 / 4 \ 5 |
| 20 | Traverse right subtree | 5 | Traverse right subtree (None) | 1 / \ 2 3 / 4 \ 5 |
| 21 | Right subtree None | None | Return | 1 / \ 2 3 / 4 \ 5 |
| 22 | Traversal complete | None | End | 1 / \ 2 3 / 4 \ 5 |
| Variable | Start | After Step 2 | After Step 5 | After Step 8 | After Step 11 | After Step 15 | After Step 19 | Final |
|---|---|---|---|---|---|---|---|---|
| Current Node | 1 | 2 | 4 | 2 | 1 | 3 | 5 | None |
| Printed Values | [] | [] | [4] | [4, 2] | [4, 2, 1] | [4, 2, 1, 3] | [4, 2, 1, 3, 5] | [4, 2, 1, 3, 5] |
Inorder Tree Traversal: - Visit left subtree first - Then visit root node - Finally visit right subtree Recursive approach is common Print nodes in ascending order for BST
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