96. 不同的二叉搜尋樹

ouyangxx發表於2024-11-11
  1. 題目連結

  2. 解題思路

    • 暴力怎麼做?n個節點,我們要先選頭節點i,頭節點選中之後,左子樹的節點數就決定了,右子樹的節點數也就決定了,所以選擇頭節點i後,不同的數目是左子樹不同數目 * 右子樹不同數目,這又是子問題了,又可以遞迴得到結果。

      • 有一個細節,假設n等於5,1,2,3,4,5,假設現在選擇了3為頭節點,右子樹不同數目有多少個?其實右子樹我並不用傳入4,5這兩個引數,我直接傳入2,代表的是右子樹有兩個節點,一共有多少種不同的數目。
    • 遞迴只有一個引數,直接加快取就可以了

  3. 程式碼

    class Solution {
    public:
        // 一共有n個節點,一共有多少種不同的搜尋二叉樹?
        int process(int n, vector<int> &dp) {
            if (n <= 1) {   //   只有一個節點,或者沒有節點了  只有一種樹
                return 1;
            }
            if (dp[n] != -1) {
                return dp[n];
            }
            int ans = 0;
            // 誰做頭?
            for (int i = 1; i <= n; ++i) {
                ans += process(i - 1, dp) * process(n - i, dp);
            }
            dp[n] = ans;
            return ans;
        }
    
        int numTrees(int n) {
            vector<int> dp(n + 1, -1);
            return process(n, dp);
        }
    };
    

相關文章