96. 不同的二叉搜索樹
給你一個整數 n ,求恰由 n 個節點組成且節點值從 1 到 n 互不相同的二叉搜索樹有多少種?返回滿足題意的二叉搜索樹的種數。
輸入:n = 3
輸出:5
思路
-
確定dp數組(dp table)以及下標的含義
dp[i] :1到i為節點組成的二叉搜索樹的個數為dp[i]。 -
確定遞推公式
dp[i] += dp[以j為頭結點左子樹節點數量] * dp[以j為頭結點右子樹節點數量]
j相當於是頭結點的元素,從1遍歷到i為止。
所以遞推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 為j為頭結點左子樹節點數量,i-j 為以j為頭結點右子樹節點數量 -
dp數組如何初始化
初始化,只需要初始化dp[0]就可以了。
從定義上來講,空節點也是一顆二叉樹,所以初始化dp[0] = 1。 -
確定遍歷順序
首先一定是遍歷節點數,從遞歸公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,節點數為i的狀態是依靠 i之前節點數的狀態。
那么遍歷i里面每一個數作為頭結點的狀態,用j來遍歷。 -
舉例推導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];
}
}