Binary Tree Traversal
Visualize inorder, preorder, and postorder traversal algorithms on any binary tree structure
Binary Tree
Click node to edit • Right-click to delete
Current Operation:
Ready to traverse. Build a tree and select a traversal type, then click "Start" to begin.
Nodes Visited
0
Time Complexity
O(n)
Space Complexity
O(h)
h = tree height (recursion stack)
Tree Size
7
Color Coding:
Traversal Type:
Simulation
Tree Structure (level-order):
[4, 2, 6, 1, 3, 5, 7]
Total nodes: 7 | Inorder: [1, 2, 3, 4, 5, 6, 7]
What are Tree Traversals?
Tree traversal is the process of visiting all nodes in a tree in a specific order. For binary trees, there are three main depth-first traversal methods: inorder, preorder, and postorder.
Traversal Types
- Inorder (Left → Root → Right): Visit left subtree, then root, then right subtree. For BST, this gives values in sorted order.
- Preorder (Root → Left → Right): Visit root first, then left subtree, then right subtree. Useful for copying tree structure.
- Postorder (Left → Right → Root): Visit left subtree, then right subtree, then root. Useful for deleting trees.
Implementation
1. Inorder Traversal
Left → Root → Right (gives sorted order for BST):
from typing import List, Optional
class TreeNode:
"""Binary tree node structure."""
def __init__(self, value: int, left: Optional['TreeNode'] = None, right: Optional['TreeNode'] = None):
self.value = value
self.left = left
self.right = right
def inorder_traversal(root: Optional[TreeNode]) -> List[int]:
"""
Perform inorder traversal: Left → Root → Right.
Visits nodes in sorted order for a BST. Useful for getting values
in ascending order.
Args:
root: Root node of the binary tree (can be None for empty tree).
Returns:
List of node values in inorder traversal order.
Time Complexity: O(n) where n is number of nodes.
Space Complexity: O(h) where h is tree height (for recursion stack).
"""
result: List[int] = []
def inorder(node: Optional[TreeNode]) -> None:
if node is None:
return
inorder(node.left) # Visit left subtree
result.append(node.value) # Visit root
inorder(node.right) # Visit right subtree
inorder(root)
return result
# Example
# Tree: 4
# / \
# 2 6
# / \ / \
# 1 3 5 7
# Inorder: [1, 2, 3, 4, 5, 6, 7]2. Preorder Traversal
Root → Left → Right:
from typing import List, Optional
class TreeNode:
"""Binary tree node structure."""
def __init__(self, value: int, left: Optional['TreeNode'] = None, right: Optional['TreeNode'] = None):
self.value = value
self.left = left
self.right = right
def preorder_traversal(root: Optional[TreeNode]) -> List[int]:
"""
Perform preorder traversal: Root → Left → Right.
Visits root before children. Useful for copying tree structure or
prefix expression evaluation.
Args:
root: Root node of the binary tree (can be None for empty tree).
Returns:
List of node values in preorder traversal order.
Time Complexity: O(n) where n is number of nodes.
Space Complexity: O(h) where h is tree height (for recursion stack).
"""
result: List[int] = []
def preorder(node: Optional[TreeNode]) -> None:
if node is None:
return
result.append(node.value) # Visit root
preorder(node.left) # Visit left subtree
preorder(node.right) # Visit right subtree
preorder(root)
return result
# Example
# Tree: 4
# / \
# 2 6
# / \ / \
# 1 3 5 7
# Preorder: [4, 2, 1, 3, 6, 5, 7]3. Postorder Traversal
Left → Right → Root:
from typing import List, Optional
class TreeNode:
"""Binary tree node structure."""
def __init__(self, value: int, left: Optional['TreeNode'] = None, right: Optional['TreeNode'] = None):
self.value = value
self.left = left
self.right = right
def postorder_traversal(root: Optional[TreeNode]) -> List[int]:
"""
Perform postorder traversal: Left → Right → Root.
Visits children before root. Useful for deleting tree nodes or
postfix expression evaluation.
Args:
root: Root node of the binary tree (can be None for empty tree).
Returns:
List of node values in postorder traversal order.
Time Complexity: O(n) where n is number of nodes.
Space Complexity: O(h) where h is tree height (for recursion stack).
"""
result: List[int] = []
def postorder(node: Optional[TreeNode]) -> None:
if node is None:
return
postorder(node.left) # Visit left subtree
postorder(node.right) # Visit right subtree
result.append(node.value) # Visit root
postorder(root)
return result
# Example
# Tree: 4
# / \
# 2 6
# / \ / \
# 1 3 5 7
# Postorder: [1, 3, 2, 5, 7, 6, 4]Time & Space Complexity
Time Complexity:
- Best/Average/Worst: O(n) - Must visit every node once
Space Complexity: O(h) where h is the height of the tree (for recursion stack). O(log n) for balanced trees, O(n) for skewed trees.
Real-World Applications
- Expression evaluation: postorder for postfix, inorder for infix
- Tree copying: preorder traversal preserves structure
- Tree deletion: postorder ensures children deleted before parent
- Sorted output: inorder gives sorted order for BST
- Serialization: converting tree to array/string representation