Backtracking: Complete Guide with Pruning Techniques
Backtracking is a systematic way to solve constraint satisfaction problems. It builds a solution incrementally and backs up as soon as it determines the current path cannot lead to a valid final solution.
Think of backtracking as smarter brute force. Instead of generating every possible solution and checking them at the end, it stops early as soon as a constraint is violated. That pruning is what turns impossible search spaces into solvable problems.
Real-World Analogy
Imagine exploring a cave with multiple branching tunnels. You want to find the exit. You take the first path. If you hit a dead end, you walk back to the last fork and try the next tunnel. You repeat until you find the exit or explore every possible path.
The exit is your solution. The forks are decision points. Walking back is the backtracking step.
Visual Explanation
Backtracking is usually visualized as a state-space tree. Each node represents a partial solution, and each edge represents a choice.
graph TD
Start[Empty Solution] --> A[Choice 1]
Start --> B[Choice 2]
A --> A1[Choice 1.1]
A --> A2[Choice 1.2]
A2 -- "Constraint Violated" --> DeadEnd[X Dead End]
DeadEnd -. "Backtrack" .-> A
A1 --> Success((Goal Found))
style Success fill:#f96,stroke:#333,stroke-width:4px
style DeadEnd fill:#ff9999,stroke:#333
The dotted backtrack arrow is the key. When the algorithm hits a constraint violation, it returns to an earlier decision point and tries a different branch instead of continuing deeper. That single decision is the difference between backtracking and brute force.
When to Use This Pattern
- You need to find all possible configurations, like all permutations, subsets, or combinations.
- The problem involves satisfying specific rules incrementally, such as placing queens on a board or filling a Sudoku grid.
- The solution can be built one piece at a time, and you can check validity after each addition.
- The search space is large enough that blind brute force would be too slow without pruning.
Complexity Analysis
| Aspect | Complexity | Explanation |
|---|---|---|
| Time (Permutations) | O(N!) | N choices at the first level, N-1 at the next, and so on |
| Time (Subsets) | O(2^N) | Each element is either included or excluded |
| Space | O(N) | Recursion depth equals the size of the largest partial solution |
The space is
Common Mistakes
Forgot to undo state changes. If you modify a shared list or set inside the recursive call, you must reverse that change after returning. Failing to do so pollutes other branches of the search tree with stale data.
Missing a base case. Without a clear stopping condition, the algorithm recurses infinitely or goes deeper than necessary. Every backtracking function needs to know when the current path is complete and valid.
Pruning too late. The whole point of backtracking is early termination. If your validity check only runs at the bottom of the tree, you are not really backtracking. You are doing brute force with extra function calls.
Adding references instead of copies. In Python, Java, and similar languages, adding
currentto your result list adds a reference to the list object itself. That list keeps changing, which corrupts every solution you already found. Always add a shallow copy.
Related Patterns
- Recursion . Backtracking is recursion applied to search. Understanding the call stack and how state flows through recursive calls is essential for debugging backtracking code.
- Graph Traversal . Many backtracking problems are graph searches in disguise. N-Queens explores a tree of board states. Sudoku explores a tree of cell assignments. The same DFS template applies to both.
- Dynamic Programming . Both DP and backtracking explore a state space. The difference is that DP uses a cache to avoid revisiting the same state, while backtracking does not. If a problem has overlapping subproblems, DP may be the better choice.
Next Steps
Once the concept is clear, make the code automatic with the code templates , then work through the practice problems to apply backtracking to real interview questions.