leetcode96 不同的二叉搜索树
题目:https://leetcode-cn.com/problems/unique-binary-search-trees/submissions/
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
思路: 动态规划,设状态dp(i)表示从1-i的序列可以组成的二叉搜索树有多少种,从1-i中任选一结点j作为根节点,那么1-j-1组成其左子树,j+1-n组成其右子树,那么以j为根节点的BST方案数就是左子树和右子树方案的乘积。事实上从j+1...n的序列BST方案数等于1...n-j,即dp(n-j)。所以状态转移方程是 \(dp(i) = \sum_j dp(j-1) * dp(i-j)\)
代码:
class Solution {
public:
int numTrees(int n){
vector<int> dp; dp.resize(n+1);
dp[0] = 1; dp[1] = 1;
for(int i = 2; i <= n; ++i)
for(int j = 1; j <= i; ++j){
dp[i] += dp[j-1] * dp[i-j];
}
return dp[n];
}
};