# Tree Data Structure: Traversals
Tree Data Structure 2 / 2
3 min read
Table of Contents
Tree Traversals
Tree traversal means visiting each node in a specific order.
Two main categories:
-
Depth-First Search (DFS) → Preorder, Inorder, Postorder
-
Breadth-First Search (BFS) → Level-order
We’ll use this basic class written in Python for examples:
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = rightPreorder Traversal (Root → Left → Right)
A / \ B C / \ D E
Preorder: A → B → D → E → C# Recursivedef preorder(node): if not node: return print(node.val) # Root preorder(node.left) # Left preorder(node.right) # Right
# Iterativedef preorder_iter(root): if not root: return stack = [root] while stack: node = stack.pop() print(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left)Inorder Traversal (Left → Root → Right)
A / \ B C / \ D E
Inorder: D → B → E → A → C# Recursivedef preorder(node): if not node: return print(node.val) # Root preorder(node.left) # Left preorder(node.right) # Right
# Iterativedef preorder_iter(root): if not root: return stack = [root] while stack: node = stack.pop() print(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left)Postorder Traversal (Left → Right → Root)
A / \ B C / \ D E
Postorder: D → E → B → C → A# Recursivedef postorder(node): if not node: return postorder(node.left) # Left postorder(node.right) # Right print(node.val) # Root
# Iterativedef postorder_iter(root): if not root: return stack, out = [root], [] while stack: node = stack.pop() out.append(node.val) if node.left: stack.append(node.left) if node.right: stack.append(node.right) for val in reversed(out): print(val)Level Order Traversal
A / \ B C / \ D E
Level Order: A → B → C → D → Efrom collections import deque
def level_order(root): if not root: return q = deque([root]) while q: node = q.popleft() print(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right)Grouped Level Order
-
Visit nodes level by level, left → right.
-
Group nodes per level.
A / \ B C / \ \ D E F
Level 1: [A] -> Start with rootLevel 2: [B, C] -> Children of ALevel 3: [D, E, F] -> Children of B and C
Output: [[A], [B, C], [D, E, F]]def level_order_grouped(root): res = [] if not root: return res q = deque([root]) while q: size = len(q) level = [] for _ in range(size): node = q.popleft() level.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) res.append(level) return resZigzag Level Order
- Visit nodes level by level, but alternate the order each level: left→right, right→left, left→right..
A / \ B C / \ \ D E F
Level 1 (Left→Right): [A]Level 2 (Right→Left): [C, B]Level 3 (Left→Right): [D, E, F]
Output: [[A], [C, B], [D, E, F]]def zigzag_level_order(root): res = [] if not root: return res q = deque([root]) left_to_right = True while q: size = len(q) level = deque() for _ in range(size): node = q.popleft() if left_to_right: level.append(node.val) else: level.appendleft(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) res.append(list(level)) left_to_right = not left_to_right return res