動態規划:給n個節點,可以組成多少個不同的二叉搜索樹


96. 不同的二叉搜索樹

給你一個整數 n ,求恰由 n 個節點組成且節點值從 1 到 n 互不相同的二叉搜索樹有多少種?返回滿足題意的二叉搜索樹的種數。

輸入:n = 3
輸出:5

思路

  1. 確定dp數組(dp table)以及下標的含義
    dp[i] :1到i為節點組成的二叉搜索樹的個數為dp[i]。

  2. 確定遞推公式
    dp[i] += dp[以j為頭結點左子樹節點數量] * dp[以j為頭結點右子樹節點數量]
    j相當於是頭結點的元素,從1遍歷到i為止。
    所以遞推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 為j為頭結點左子樹節點數量,i-j 為以j為頭結點右子樹節點數量

  3. dp數組如何初始化
    初始化,只需要初始化dp[0]就可以了。
    從定義上來講,空節點也是一顆二叉樹,所以初始化dp[0] = 1。

  4. 確定遍歷順序
    首先一定是遍歷節點數,從遞歸公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,節點數為i的狀態是依靠 i之前節點數的狀態。
    那么遍歷i里面每一個數作為頭結點的狀態,用j來遍歷。

  5. 舉例推導dp數組
    n為5時候的dp數組狀態如圖:

代碼

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0] = 1;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                dp[i] += dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM