题解 | #有多少个不同的二叉搜索树#

有多少个不同的二叉搜索树

http://www.nowcoder.com/practice/16d23f940a084023b3be6019262589dc

1.思路

考虑f(i)f(i)表示第ii个节点作为根节点时所有二叉搜索树的可能,题目要求是求给定nn有多少种可能,即dp(n)=f(1)+f(2)++f(n)dp(n)=f(1)+f(2)+\cdots +f(n)
我们知道,f(i)=dp[i1]dp[ni]f(i)=dp[i-1]* dp[n-i],即第ii个节点为根节点时,左节点有i1i-1个,右节点有nin-i个,f(i)f(i)即为左右节点所有二叉搜索树的可能的乘积。 现在结合两个式子,可以得出
dp[n]=dp[0]dp[n1]+dp[1]dp[n2]++dp[n1]dp[0]dp[n]=dp[0]* dp[n-1] + dp[1]* dp[n-2] + \cdots +dp[n-1] * dp[0]

2.代码实现

let n = ~~readline()

function main(n) {
    const dp = new Array(n + 1).fill(0)
    dp[0] = 1, dp[1] = 1
    for(let i = 2 ; i <= n ; i++) {
        for(let k = 1 ; k <= i ; k++) {
            dp[i] += dp[k-1] * dp[i - k]
        }
    }
    return dp[n]
}

console.log(main(n))
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务