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)
}
}