96. 不同的二叉搜索树(中)
题目
动态规划
- 由于 1,2...n 这个数列是递增的,所以我们从任意一个位置“提起”这课树,都满足二叉搜索树的这个条件:左边儿子数小于爸爸数,右边儿子数大于爸爸数。例如,我要用 [1,2,3,4,5,6] 构建。首先,提起 "2" 作为树根,[1]为左子树,[3,4,5,6] 为右子树,现在就变成了一个更小的问题:如何用 [3,4,5,6] 构建搜索树?满足动态规划的重叠子问题的条件。
class Solution:
def numTrees(self, n: int) -> int:
dp = [0] * (n + 1) # 创建动态规划数组,dp[i]表示i个节点能够构成的二叉搜索树的数量
dp[0] = 1 # 空树也算一种情况,所以初始化dp[0]为1
dp[1] = 1 # 只有一个节点的情况下,只有一种构成二叉搜索树的方式
for i in range(2, n + 1): # 从2开始计算,直到n
for j in range(i): # 遍历j,j表示左子树的节点数量
dp[i] += dp[j] * dp[i - j - 1] #组合左右子树不同的可能性
return dp[n] # 返回dp数组的最后一个元素,即n个节点能够构成的二叉搜索树的数量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人