题目:给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
二叉搜索树又称二叉排序树,具有以下性质:
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
通过画图发现具有递推关系
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1); // dp[i]:从1到i的互不相同的二叉搜索树个数
if(n<=2)
return n;
dp[0]=1;
dp[1]=1;
dp[2]=2;
for(int j=3;j<=n;j++)
{
int flag=0;
for(int k=0;k<j/2;k++)
{
flag=flag+2*dp[k]*dp[j-1-k];
}
if(j%2) //奇数
dp[j]=flag+dp[(j-1)/2]*dp[(j-1)/2];
if(!(j%2)) //偶数
dp[j]=flag;
}
return dp[n];
}
};