Concept Flow - Tree Traversal Preorder Root Left Right
Start at Root
Visit Node (Root)
Traverse Left Subtree
Traverse Right Subtree
Done
Start at the root node, visit it, then recursively traverse the left subtree, followed by the right subtree.
class Node: def __init__(self, val): self.val = val self.left = None self.right = None def preorder(root): if root: print(root.val) preorder(root.left) preorder(root.right)
| Step | Operation | Node Visited | Pointer Changes | Tree State (Visual) |
|---|---|---|---|---|
| 1 | Start at root | A | current = A | A ├─ B └─ C |
| 2 | Visit node | A | print A | A ├─ B └─ C |
| 3 | Traverse left subtree | B | current = B | A ├─ B └─ C |
| 4 | Visit node | B | print B | A ├─ B └─ C |
| 5 | Traverse left subtree | D | current = D | A ├─ B │ ├─ D │ └─ E └─ C |
| 6 | Visit node | D | print D | A ├─ B │ ├─ D │ └─ E └─ C |
| 7 | Traverse left subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C |
| 8 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C |
| 9 | Traverse right subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C |
| 10 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C |
| 11 | Traverse right subtree | E | current = E | A ├─ B │ ├─ D │ └─ E └─ C |
| 12 | Visit node | E | print E | A ├─ B │ ├─ D │ └─ E └─ C |
| 13 | Traverse left subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C |
| 14 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C |
| 15 | Traverse right subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C |
| 16 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C |
| 17 | Return from B subtree | B | return | A ├─ B │ ├─ D │ └─ E └─ C |
| 18 | Traverse right subtree | C | current = C | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 19 | Visit node | C | print C | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 20 | Traverse left subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 21 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 22 | Traverse right subtree | F | current = F | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 23 | Visit node | F | print F | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 24 | Traverse left subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 25 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 26 | Traverse right subtree | None | current = None | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 27 | Return from None | None | return | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 28 | Return from C subtree | C | return | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| 29 | Return from root | A | return | A ├─ B │ ├─ D │ └─ E └─ C └─ F |
| Variable | Start | After Step 1 | After Step 3 | After Step 5 | After Step 11 | After Step 18 | After Step 22 | Final |
|---|---|---|---|---|---|---|---|---|
| current | None | A | B | D | E | C | F | None |
| visited_nodes | [] | [A] | [A, B] | [A, B, D] | [A, B, D, E] | [A, B, D, E, C] | [A, B, D, E, C, F] | [A, B, D, E, C, F] |
Preorder Tree Traversal: - Visit root node first - Recursively traverse left subtree - Recursively traverse right subtree - Stops when node is None - Prints nodes in Root-Left-Right order
root?1 / \ 2 3 / \ 4 5
def preorder(root):
if root is None:
return
print(root.val)
preorder(root.right)
preorder(root.left)root?Pass the test and this pattern moves unknown