1. 程式人生 > >【LeetCode 中等題】49-不同的二叉搜尋樹

【LeetCode 中等題】49-不同的二叉搜尋樹

題目描述:給定一個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?

示例:

輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:

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

解法1。假設n個節點存在二叉排序樹的個數是G(n),令f(i)為以i為根的二叉搜尋樹的個數,即有:G(n) = f(1) + f(2) + f(3) + f(4) + ... + f(n)。n為根節點,當i為根節點時,其左子樹節點個數為[1,2,3,...,i-1],右子樹節點個數為[i+1,i+2,...n],所以當i為根節點時,其左子樹節點個數為i-1個,右子樹節點為n-i,而這左子樹的可能排布方式有G(i-1)種,同理右子樹的為G(n-i),即f(i) = G(i-1)*G(n-i),

上面兩式可得:G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)

解題思路:假設n個節點存在二叉排序樹的個數是G(n),1為根節點,2為根節點,...,n為根節點,當1為根節點時,其左子樹節點個數為0,右子樹節點個數為n-1,同理當2為根節點時,其左子樹節點個數為1,右子樹節點為n-2,所以可得G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        # 用一個一維陣列儲存0-n的所有排布方式個數,自底向上計算出dp[n]並返回
        dp = [0 for _ in range(n+1)]
        dp[0] = 1
        dp[1] = 1
        for i in range(2,n+1):
            for j in range(i):
                dp[i] += dp[j]*dp[i-j-1]
        return dp[n]
        

 

 

參考連結:http://www.cnblogs.com/grandyang/p/4299608.html