leetcode不同的二叉搜索树python

题目
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

思路及代码
这题也是刷了好几遍,今天再看,一点思路都没有。只能说理解的不到位。

二叉搜索树

首先回顾一下二叉搜索树。什么是二叉搜索树?空树或者满足做节点值小于根节点值,右节点值大于根节点值,左右子树也均是二叉搜索树。

动规五要素

然后回顾一下动态规划五要素。第一明确dp数组和下标的含义,第二初始化,第三递推公式,第四遍历顺序,第五推导实例。

本题思路

再回到这题中。当n=1的时候,就一种情况;当n=2的时候,有两种情况。当n=3的时候,二叉树的数目 = 1为根的二叉树的个数 + 2为根的二叉树的个数 + 3为根的二叉树的个数。

1为根的二叉搜索树的个数= 左子树结点数为0的二叉搜索树 * 右子树节点数为2的二叉搜索树

2为根的二叉搜索树的个数 = 左子树节点数为1的二叉搜索树 * 右子树节点数为1的二叉搜索树

3为根的二叉搜索树的个数= 左子树结点数为2的二叉搜索树 * 右子树节点数为1的二叉搜索树

因此dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0]

dp数组及下标的含义:dp[i]表示的是1-i为结点组成二叉搜索树的个数。
初始化:dp数组里所有元素均为0,dp[0]= 1,dp[1]= 1
递推公式:dp[i] += dp[j-1]*dp[i-j]
遍历顺序:i从2~n,j从1到i
推导实例:n=3,上述已推导
dp[2] = dp[0]*dp[1] + dp[1]*dp[0] = 2
dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0] =2+1+2 = 5

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[0], dp[1] = 1, 1
        for i in range(2, n+1):
            for j in range(1,i+1):
                dp[i] += dp[j-1] * dp[i-j]
        return dp[-1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值