刷题记录7.15 不同的二叉搜索树

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

首先明确一下二叉搜索树:根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

看了大佬的动态规划思路,题目可以简化为一个动态规划问题,设T(n)为n个根节点的二叉树的个数,若1为根节点,则1的左子树为0,右子树的根节点个数T(n-1-0);2为根节点则,左子树为T(2-1),右子树为T(n-1-(2-1)); 起始值T(1) = 1,T(0) = 1。

归纳即为T(n) = T(n-1) * T(0) + T(n-2) * T(1) + … + T(1) * T(n-2) + T(0) * T(n-1)

class Solution:
    def numTrees(self, n: int) -> int:
        T = dict()
        T[0], T[1], T[n] = 1, 1, 0
        for j in range(1,n):
            T[j] = self.numTrees(j)       
        for i in range(0,n):
                T[n] += T[i] * T[n-i-1]
        return T[n]

或者不用递归

class Solution:
    def numTrees(self, n: int) -> int:
        T = [0] * (n+1)
        T[0], T[1] = 1, 1
        for j in range(2,n+1):     
            for i in range(0,j):
                T[j] += T[i] * T[j-i-1]
        return T[n]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值