原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/
1、递归(超时)
int numTrees(int n) {
return (n)?dp(1,n):0;
}
int dp(int start,int end){
int nums=0;
if(start>end) return 1;
for(int i=start;i<=end;i++){
nums+=dp(start,i-1)*dp(i+1,end);
}
return nums;
}
2、动态规划
dp[i]表示有i个节点时的搜索二叉树数量
状态转移
dp[i+1]=dp[i]*dp[0]+dp[i-1]*dp[1]+dp[i-2]*dp[2]+...+dp[2]*dp[i-2]+dp[1]*dp[i-1]+dp[0]*dp[i]
通俗的理解就是,总数目为:同一根节点的树数量为左右子树数量相乘,不同根节点的树数量为各自相加。
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=0,k=i-1;j<i;j++,k=i-j-1){
dp[i]+=dp[j]*dp[k];
}
}
return dp[n];
}