1. Recursive Divide and Conquer (Unmemoized)
Intuition
Every value i in 1..n can serve as root. Keys < i go left (i-1 keys), keys > i go right (n-i keys). Sum product across all possible roots.
Algorithm
- Define recursive function numTrees(n).
- Base cases: if n <= 1, return 1 (empty tree or single node has 1 unique structure).
- Initialize total = 0.
- Iterate root i from 1 to n: total += numTrees(i - 1) * numTrees(n - i).
- Return total.
#include <iostream> class Solution {public: int numTrees(int n) { if (n <= 1) return 1; int total = 0; for (int i = 1; i <= n; ++i) { total += numTrees(i - 1) * numTrees(n - i); } return total; }}; int main() { Solution sol; std::cout << "Recursive n=3: " << sol.numTrees(3) << " (Expected: 5)\n"; std::cout << "Recursive n=4: " << sol.numTrees(4) << " (Expected: 14)\n"; return 0;}Time & Space Complexity
- Time complexity:
O(3^n) - Space complexity:
O(n)