Java对于求以 1 ... n 为节点组成的二叉搜索树有多少种?

//首先此题可以用动态规划去写
----->逐个的去遍历每个元素作为根节点,左边的为左子树,右边的为右子树
------特点是:左边的小于右边的,1-n正好是个有序的数组
//------->先确定状态
----->以G(n)表示1--n总共的二叉搜索树的数量
----->以F(i,n)表示以i的根的二叉搜索树的数量

//------>再确定状态转移方程
------------>G(n)=∑n​F(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)=∑n​G(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];
  }
}
原文地址:https://www.cnblogs.com/z2529827226/p/11743316.html