力扣:96.不同的二叉搜索树
1、题目
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5示例 2:
输入:n = 1
输出:1
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
2、思路分析
首先本题采用动态规划解题方法,创建dp
数组大小为n+1
。
dp[i]的定义为有i个节点的二叉搜索树的种数。
首先分析 dp[1]=1
;
dp[2]=2
;
dp[3]
总共有如图所示情况;
可以发现,
- 当1为根节点时,1的右子树的情况分别照应dp[2]的情况;
- 2为根节点的时候,左右子树的情况照应dp[1]的情况;
- 3为节点的时候,左子树照应dp[2]的情况;
由此可以推理出:
dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0];
即dp[i]
等于dp[0...i-1]*dp[i-1...0]
的和。
3、代码如下(c++)
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1);
dp[0]=1;
for(int i =1;i<=n;i++){
for(int j=0;j<i;j++){
dp[i]+=dp[j]*dp[i-j-1];
}
}
return dp[n];
}
};