1.不同的二叉搜索树
从递归角度来进行逐个计算
类似于斐波那契数列的计算方式
先考虑 0个结点 一种(空树)
1个结点 一种
2个结点的时候就是考虑 先固定一个结点作为根结点 然后分两种啊 一种是左子树结点数0右子树为1 另一种是 左为1右为0 节点为3,4,n的情况不断累加
class Solution {
int numTrees(int n) {
//dp[i]表示有i个结点时二叉树有多少种可能
int[] dp = new int[n + 1];
//初始化
dp[0] = 1;
dp[1] = 1;
//因为计算dp[n]需要知道dp[0]--->dp[n-1]。所以第一层循环是为了求dp[i]
for (int i = 2; i <= n; i++) {
//当有i个结点时,左子树的节点个数可以为0-->i-1个。剩下的是右子树。
for (int j = 0; j < i; j++) {
dp[i] += dp[j] * dp[i - j - 1];
}
}
return dp[n];
}
};