1. 程式人生 > >Crack LeetCode 之 96. Unique Binary Search Trees

Crack LeetCode 之 96. Unique Binary Search Trees

https://leetcode.com/problems/unique-binary-search-trees/description/

這道題的本質是求可能的二叉樹的形態總數。任選一個節點做根節點,將左右兩邊可能的二叉樹形態的數目相乘得到一個結果數。按照以上方法遍歷所有的節點並累加結果數即可。可以採用動態規劃的方法,用一個res陣列儲存從0到n個節點對應的結果數。另外,本題也是一個經典的卡特蘭數問題,具體討論參見link。

以下為C++程式碼,時間複雜度為O(n平方),空間複雜度為O(n)。

class Solution {
public:
    int numTrees(int n) {
        if (n == 0)
            return 0;

        vector<int> res;
        res.push_back(1);
        res.push_back(1);

        for (int i = 1; i<n; ++i) {
            res.push_back(0);
            for (int j = 0; j<=i; ++j)
                res[i+1] += res[i-j]*res[j];
        }

        return res[n];
    }
};