递归难题
第一步:
还是老样子先写出递推数组的含义
dp[i] :是整数i 个节点组成的节点的二叉搜索树种数
第二步:
找到dp数组的递推公式
先画个图看看
我思考了很久,一开始我想的是新的节点要插在哪里,然后发现这个思路错了
所以 dp[3] = dp[0] * dp[2] + dp[1]*dp[1] + dp[2]*dp[0],
所以对于某一个节点dp[i]都可以看作是其左右节点是dp[i-j] * dp[j -1]的循环相加
class Solution {
public int numTrees(int n) {
int [] dp = new int[n+1];
dp[1] = 1;
dp[0] = 1;
for(int i = 2; i <= n ;i++){
for(int j = 1;j <= i ; j++){
dp[i] += dp[i-j] * dp[j-1];
}
}
return dp[n];
}
}
要不,大脑对着代码跑一