給定節點數,判斷二叉搜索樹的數量 Unique Binary Search Trees

問題:ip

Given n, how many structurally unique BST's (binary search trees) that store values 1...n?get

For example,
Given n = 3, there are a total of 5 unique BST's.io

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

解決:class

① 二叉搜索樹有個性質,就是左邊的數都比根小,右邊的數都比根大。另外,題目說明二叉樹的節點是從1到n,因此咱們能肯定若是根爲k,則根左邊的數是1到k-1,根右邊的數是k+1到n。時間 O(N!) 空間 O(N)二叉樹

這道題其實是 Catalan Number卡塔蘭數的一個例子,當 n = 1時,只能造成惟一的一棵二叉搜索樹,n分別爲1,2,3的狀況以下所示:搜索

n = 0 時賦爲1,由於空樹也算一種二叉搜索樹;方法

n = 1時的狀況能夠看作是其左子樹個數乘以右子樹的個數,左右字數都是空樹,因此1乘1仍是1。im

n = 2時,因爲1和2均可覺得根,分別算出來,再把它們加起來便可。n = 2的狀況可由下面式子算出:       img

dp[2] =  dp[0] * dp[1]   (1爲根的狀況)di

    + dp[1] * dp[0]    (2爲根的狀況)

同理可寫出 n = 3 的計算方法:

dp[3] =  dp[0] * dp[2]   (1爲根的狀況)

    + dp[1] * dp[1]    (2爲根的狀況)

      + dp[2] * dp[0]    (3爲根的狀況)

由此能夠得出卡塔蘭數列的遞推式爲:

因此,能夠獲得以下代碼:

class Solution { //0ms     public int numTrees(int n) {         int[] dp = new int[n + 1];         dp[0] = 1;         dp[1] = 1;         for (int i = 2;i <= n;i ++ ) {//計算節點數2到n的BST             for (int j = 0;j < i ;j ++ ) {                 dp[i] += dp[j] * dp[i - j - 1];             }         }         return dp[n];     } }

相關文章
相關標籤/搜索