稍微有那么点意思了,用的DP。
修修改改,居然做出来了。
思路就是N的时候
分别以1,2,3,4...n为ROOT
左边分别有
n-1,n-2...0
0,1,2,3...n-1
DP[n]表示n有几种可能:
0表示null,就1种可能
1也只有1种可能。
所以就是dp左边*dp右边
public class Solution {
public int numTrees(int n) {
if(n == 0) return 1;
if(n == 1) return 1;
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <=n; i++)
{
for(int j = 1; j <= i;j++)
{
dp[i] += dp[j-1]*dp[i-j];
//System.out.println(dp[i]);
}
}
return dp[n];
}
}
好开心啊。。自己做出来了~~
我一刷是怎么做出来的。。。
比如N=5的时候,我们可以以1 2 3 4 5作为ROOT。
假设以3作为ROOT,左边有2种可能,右边有2种可能,最后就是4种可能。
以2为ROOT的话,左边有1种可能,右边是(345)组成的二叉树的可能。
这么看来是动态规划。
n = 5 就是以12345为ROOT的所有可能性加起来。。
每种可能性里,左右的可能性要相乘。
public class Solution {
public int numTrees(int n) {
if (n == 0) return 1;
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 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];
}
}