題目描述:java
給定一個整數 n,求以 1 ... n 爲節點組成的二叉搜索樹有多少種?blog
示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不一樣結構的二叉搜索樹: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路解析:排序
動態規劃io
假設n個節點存在class
令G(n)表示從1到n能夠造成二叉排序樹個數搜索
令f(i)爲以i爲根的二叉搜索樹的個數di
即有:G(n) = f(1) + f(2) + f(3) + f(4) + ... + f(n)動態規劃
n爲根節點,當i爲根節點時,其左子樹節點個數爲[1,2,3,...,i-1],右子樹節點個數爲[i+1,i+2,...n],因此當i爲根節點時,其左子樹節點個數爲i-1個,右子樹節點爲n-i,即f(i) = G(i-1)*G(n-i),new
上面兩式可得:G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)return
代碼實現:
class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { for (int j = 0; j < i; j++) { dp[i] += dp[j] * dp[i - j - 1]; } } return dp[n]; } }
空間複雜度:O(N