重点:
(1)动态规划:比较简单,不难想出来,固定节点数能组成的搜索树的种类是一定的;
难度中等
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 19
解析:
二叉搜索树的个数。动态规划。
对于一个有序序列,1个节点:1种,两个节点:2种;三个节点:
(1)dp数组含义及下标:dp[i]表示i个节点数,所组成的二叉搜索树的最大个数;
(2)递推公式:
当i个节点时,数字从1到i,分别作为头节点:
——1和i为头节点时,dp[i-1]+dp[i-1];
——2和i-1为头节点时,左右子节点确定,另一个子树分别为dp[i-2]+dp[i-2];
——3和i-2为头节点时,dp[2]*dp[i-3]+dp[2]*dp[i-3];
(3)初始化:dp[0]=1,dp[1]=1,dp[2]=dp[1]+dp[1]=2;
代码:
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0]=1;
dp[1]=1;
for(int i=2;i<n+1;i++){
for(int j=1;j<=i;j++)
dp[i]+=dp[j-1]*dp[i-j];
}
return dp[n];
}
};