class Solution:
"""
96. 不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
"""
def numTrees(self, n: int) -> int:
# 思路:双层循环递推法,抽象出数学公式,假设f(i)表示i个节点组成的不同二叉树的数目,
# 抽象成[1, i]闭区间内,以j节点分割两个左右子树数目f(j-1)、f(i-j)的乘积和,其中j从1遍历到i
# 1. 初始化及特殊处理
if n == 1: return 1
# 初始化f数组, 存放f(i)的值, n+1个表示f(0)也算进去,表示左右子树存在0个节点的情况
f = [0]*(n+1)
f[0] = 1
# 2. 双层遍历处理
for i in range(1, n+1):
# j作为左右子树分割点
for j in range(1, i+1):
# j-1代表左子树j-1个节点,i-j代表右子树i-j个节点
# 比如1个节点的情况,左右子树分割点是1,左右子树的数量都是0
f[i] += f[j-1] * f[i-j]
# 3. 返回结果值
return f[n]
08-11
221