//首先此题可以用动态规划去写 ----->逐个的去遍历每个元素作为根节点,左边的为左子树,右边的为右子树 ------特点是:左边的小于右边的,1-n正好是个有序的数组 //------->先确定状态 ----->以G(n)表示1--n总共的二叉搜索树的数量 ----->以F(i,n)表示以i的根的二叉搜索树的数量 //------>再确定状态转移方程 ------------>G(n)=∑nF(i,n) ------------------>F(i,n)=G(i-1)*G(n-1)----以i为根节点的二叉搜索树的数量 ------------------------>等于以n=i-1与n=n-i的数量的乘积,如F(2,5)=G(1)*G(3) --------------->从而推出--->G(n)=∑nG(i−1)⋅G(n−i) 代码如下: public class Solution { public int numTrees(int n) { int[] G = new int[n + 1]; G[0] = 1; //没有节点则为0,空树只有1个 G[1] = 1; //有1个节点,树只有1个 for (int i = 2; i <= n; ++i) { //要想得到以1-n的总二叉搜索树的总数量则需要把之前的也计算出来 for (int j = 1; j <= i; ++j) { G[i] += G[j - 1] * G[i - j]; } } return G[n]; } }