96. 不同的二叉搜索树
给你一个整数
n
,求恰由n
个节点组成且节点值从1
到n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例 1:
输入:n = 3 输出:5示例 2:
输入:n = 1 输出:1提示:
1 <= n <= 19
class Solution(object):
def numTrees(self, n):
"""
:type n: int
:rtype: int
1.明确dp数组含义: dp[i]表示i对应的dp[i]二叉树的数目
2.确实递推公式:dp[i] += dp[j - 1] * dp[i - j];
j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量
3.初始化dp数组: dp[0] = 1, dp[1] = 1,
4.确定遍历顺序: 从小到大遍历,大的值是小的值累加推出来的
5.打印dp数组: debug
time: O(n^2)
space: O(n) 用于存储动态规划数组 dp
"""
# 初始化dp数组
dp = [0] * (n+1) # 考虑n = 0的特殊情况,所以n+1而不是n
#base case
dp[0] = 1
dp[1] = 1
for i in range(2, n+1): # 遍历从1到n的每个数字
for j in range(1,i+1): # 对于每个数字i,计算以i为根节点的二叉搜索树的数量
# 利用动态规划的思想,累加左子树和右子树的组合数量
dp[i] += dp[j - 1] * dp[i - j]
return dp[n]