思考过程:
1.能不能递归求出所有的二叉搜索树呢?
2.相邻的答案之间有没有规律呢?
3.找不到规律,但找出了每一个答案下的所有结果
4.看题解,才明白。。
下次做DP题目也这么思考,先看递归否,再找怎么由之前的答案推出现在的答案来。
- ans[n]为所求答案,也就是节点数为n时,有多少二叉搜索树。
- f(i)是以i为根节点的二叉搜索树的个数,左子树有i-1个元素,右子树有n-i个元素。
- 所以f(i)=ans[i-1]*ans[n-i],左子树有ans[i-1]个可能,所以要相乘。
class Solution {
public int numTrees(int n) {
int[] ans=new int[n+1];
ans[0]=ans[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
ans[i]+=ans[j-1]*ans[i-j];
}
}
return ans[n];
}
}