96. 不同的二叉搜索树

题目描述:

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

示例:

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

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

个人思路:

我看到这道题的第一反应是用递归。因为首先1...n是一个天然有序的列表,从中以任意一个元素将列表分割成左右两部分,这两部分内部依然可以保持有序。而二叉搜索树维持的是一个节点间的相对关系,换句话说若一个列表元素的个数一定,相对关系也一致的话,那么这个列表可以确定出的二叉搜索树的结构数也是确定的。

基于以上分析,可以依次以这几个节点为根,将所有节点分为左(值小于该节点)右(值大于该节点)两个部分,那么以该节点为根的二叉搜索树的结构个数=左子树的结构数*右子树的结构数,并可以递归进行计算。当然递归过程中会有很多重复计算,不够高效,可以采用更为高效的动态规划算法进行计算。

具体代码如下:

# 递归
class Solution:
    def numTrees(self, n: int) -> int:
        if n <= 1:
            return n
        num = 0
        # 根据对称性,减少计算量
        for i in range(n // 2):
            num += self.numTrees(i) + self.numTrees(n - 1 - i)
        num *= 2
        return num if n % 2 == 0 else num + self.numTrees(n // 2)

# 动态规划 摘自官方题解
class Solution:
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        G = [0]*(n+1)
        G[0], G[1] = 1, 1

        for i in range(2, n+1):
            for j in range(1, i+1):
                G[i] += G[j-1] * G[i-j]

        return G[n]

作者:LeetCode
链接:https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值