Breaking problems into smaller subproblems — the foundation of divide-and-conquer and dynamic programming.
Understand recursion from the ground up — base cases, recursive cases, the call stack, and when recursion is the right tool.