【动态规划】96. 不同的二叉搜索树
题目:

解答:
方法一:动态规划
设求以1...n为节点的二叉搜索树种数的问题为函数 G(n)
这个问题可以分解为以i为根的二叉搜索树的种数的和。设以i为根的二叉搜索树的种数用函数F(i,n)表示。
则有:G(n) = ∑ F(i,n)
F(i,n)可以由左子树和右子树的二叉搜索树种数的笛卡尔积表示
F(i,n) = G(i-1) * G(n-i)
所以:G(n) = ∑ G(i-1) * G(n-i)
class Solution { public int numTrees(int n) { int[] G = new int[n+1]; G[0] = 1; G[1] = 1; for(int i=2;i<=n;i++) for(int j = 1;j<=i;j++){ G[i] +=G[j-1]*G[i-j]; } return G[n]; } }
方法二:数学方法

class Solution { public int numTrees(int n) { // 提示:我们在这里需要用 long 类型防止计算过程中的溢出 long C = 1; for (int i = 0; i < n; ++i) { C = C * 2 * (2 * i + 1) / (i + 2); } return (int) C; } }

浙公网安备 33010602011771号