不同的二叉搜索树(96)
题目描述:
状态表示:
建立一维数组dp,使用dp[i]来表示i个节点时有的二叉搜索树种类。
状态转移方程:
因为dp[i]表示有i个节点,我们设置一个循环,循环下标为j,此时j代表第几个节点为根节点。此时第j个节点就将一个二叉树分割成两个子树,这样相当于最终二叉树的种类dp[i]=dp[j-1]* dp[i-j],也就是最终二叉树的种类为两个子树的种类数的乘积,具体看代码。
初始化:
对于dp数组,dp[0]表示此时没有节点,那么此时二叉树的种类还是有一种,因为空树也是一种二叉树,所以给dp[0]赋值为1.
填表顺序:
从左至右。
返回值:
因为建立dp数组时长度为n+1,所以返回值为dp[n]。
代码如下:
class Solution {public int numTrees(int n) {int[] dp = new int[n + 1];dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
}
题目链接
时间复杂度:O(N^2)
空间复杂度:O(N)