思路:
此题的难点是找出递推公式!
首先要知道什么是二叉搜索树,其次,要将n=2的二叉搜索树画出来,然后发现其中的规律。
在n=3的情况下:
当头节点是1时,其左右孩子为n=2时的二叉搜索树的布局;
当头节点是2时,其左右孩子是n=1的二叉搜索树的布局;
当头结点是3时,其左右孩子是n=2的二叉搜索树的布局.
不难发现:
dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]
以上就可以知道该dp数组的递推公式为:
dp[i] += dp[j]*dp[i-1-j];
那就开始递归五部曲
1.定义dp数组
dp[i] :表示数字i有的dp[i]种二叉搜索树的排序。
2.递推公式
dp[i] += dp[j]*dp[i-1-j];
3.初始化dp数组
dp[0]=1;
dp[1]=1;
4.遍历顺序
由递推公式可以知道,dp[i]与其前面的数据有关,所以就是正序遍历。
5.打印dp数组
由dp数组的定义可以知道,整数n的二叉搜索树个数为dp[n];所以最后输出dp[n],定义dp数组的长度是定义为n+1。
代码
class Solution {
public int numTrees(int n) {
int dp[] = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2;i<=n;i++){
for(int j = 0;j<i;j++){
dp[i] += dp[j]*dp[i-1-j];
}
}
return dp[n];
}
}