96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution:
def numTrees(self, n: int) -> int:
#dp是什么?
#dp为 节点数为n时有多少种方案
dp = [0] * (n+1)
#dp如何初始化?
dp[0] = 0
dp[1] = 1
# dp[2] = 2
#如何推导?
#[1]
# 左子树为0,右子树为0
#[1,2]
# 1为头节点时, 左子树节点数为0,右子树节点数为1
# 2为头节点时,左子树节点数为1,右子树节点数为0
#[1,2,3]
# 1为头节点时,左子树节点数为0,右子树节点数为2
# 2为头节点时,左子树节点数为1,右子树节点数为1
# 3为头节点时,左子树节点数为2,右子树节点数为0
#[1,2,3,4]
# 1为头节点时,左子树节点数为0,右子树节点数为3
# 2为头节点时,左子树节点数为1,右子树节点数为2
# 3为头节点时,左子树节点数为2,右子树节点数为1
# 4为头节点时,左子树节点数为3,右子树节点数为0
#dp的推导顺序?
for index in range(2,n+1):
nums = 0
for i in range(1,index+1):
left = i - 1
right = index - i
nums += max(dp[left],1) * max(dp[right],1)
dp[index] = nums

#举例推导dp
return dp[n]