1. 程式人生 > 實用技巧 >leetcode刷題筆記九十六題 不同的二叉搜尋樹

leetcode刷題筆記九十六題 不同的二叉搜尋樹

leetcode刷題筆記九十六題 不同的二叉搜尋樹

源地址:96. 不同的二叉搜尋樹

問題描述:

給定一個整數 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的每個結點作為root, 以左右子樹結點數對應dp值進行組合
初始狀態: dp(0) = 1, dp(1) = 1
狀態轉移方程:dp(n) = dp(0)*dp(n-1) + ... + dp(n-1)*dp(0) 
*/
object Solution {
    def numTrees(n: Int): Int = {
        val dp = Array.fill(n+1)(0)
        if(n == 0) return 1
        dp(0) = 1
        dp(1) = 1
        for(length <- 2 to n){
            for(root <- 1 to length){
                val left = root - 1
                val right = length - root
                dp(length) += dp(left) * dp(right)
            }
        }
        return dp(n)
    }
}