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)
    }
}
posted @ 2020-07-31 17:33  ganshuoos  阅读(104)  评论(0编辑  收藏  举报