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];
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM