//首先此題可以用動態規划去寫 ----->逐個的去遍歷每個元素作為根節點,左邊的為左子樹,右邊的為右子樹 ------特點是:左邊的小於右邊的,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]; } }