问题描述:二叉树计数
输入:5 输出:2
import java.util.*;
public class Solution {
static final int MOD = 1000000007;
public int cntOfTrees(int n) {
// 基础情况处理
if (n == 0 || n == 1) return 1;
// 奇数节点的二叉树计算
if ((n % 2) == 0) return 0;
else return goodTrees(n);
}
public int goodTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1; // 空树
dp[1] = 1; // 单节点树
for (int i = 3; i <= n; i += 2) { // 只考虑奇数个节点
for (int j = 1; j < i-1; j += 2) { // j 作为左子树的节点数
dp[i] = (dp[i] + (int)((long)dp[j] * dp[i - 1 - j] % MOD)) % MOD; // 累加左右子树组合的数目
}
}
// 返回n个节点时的好二叉树数量
return dp[n];
}
}