1. Recursive Tree Partitioning
Intuition
Recursively try every key in the range [i, j] as the root of the subtree.
Algorithm
- Define
solve(i, j). - If
i > j, return 0. - If
i == j, returnfreq[i]. - Calculate
fSum = sum(freq[i..j]). - For each
rfromitoj: -
minCost = min(minCost, solve(i, r - 1) + solve(r + 1, j)). - Return
fSum + minCost.
#include <iostream>#include <vector>#include <numeric>#include <algorithm> using namespace std; class Solution { int sumFreq(const vector<int>& freq, int i, int j) { int s = 0; for (int k = i; k <= j; ++k) s += freq[k]; return s; } int solve(int i, int j, const vector<int>& freq) { if (i > j) return 0; if (i == j) return freq[i]; int fSum = sumFreq(freq, i, j); int minCost = 1e9; for (int r = i; r <= j; ++r) { int cost = solve(i, r - 1, freq) + solve(r + 1, j, freq); minCost = min(minCost, cost); } return fSum + minCost; }public: int optimalSearchTree(vector<int>& keys, vector<int>& freq, int n) { return solve(0, n - 1, freq); }}; int main() { Solution sol; vector<int> keys = {10, 12, 20}; vector<int> freq = {34, 8, 50}; cout << "Optimal BST Cost: " << sol.optimalSearchTree(keys, freq, 3) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(Catalan(n) * n) = O(4^n / sqrt(n)) - Space complexity:
O(n) call stack