1.题目描述:
题目链接:力扣https://leetcode-cn.com/problems/unique-binary-search-trees/
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例1:
输入:n=3;
输出:5
解释:
2.题目分析 :
考点1:二叉搜索树
二叉搜索树的左子树所有节点值都小于根节点,右子树所有节点值都大于根节点
因此把1,2,3......n;分成两段,[1,root-1], root, [root+1,n]
考点2:动态规划
由二叉搜索树的特点,将n个数分成两段,那么能组成的总数就等于两段分别能组成的二叉搜索树总数的乘积;
例如:数组:1,2,3,4,5;以3为root,那么此时的总数num[3]=dp[2]*dp[2](左子树:1,2;右子数:4,5);
而dp[5]等于遍历数组,分别作为root计算出num[j],最后相加;
状态转移方程:
for(int j=0;j<i;j++){
dp[i]+=dp[j]*dp[j-i];//每一次循环都是计算一次num[j]
}
// dp[i]: 将1~n看作是长度为n的数组,dp[i]表示长度为i的节点数组能组成的二叉搜索树的数量
3.代码:
public int numTrees(int n){
int[] dp=new int[n+1];
dp[0]=1;//空树
dp[1]=1;//当长度为0或者长度为1时,只能组成一种二叉搜索树
for(int i=2;i<=n;i++){
for(int j=0;j<i;j++){
dp[i]+=dp[j]*dp[i-j];
}
}
return dp[n];
}