96. Unique Binary Search Trees -Medium

本文介绍了一种使用动态规划方法来计算对于给定数值n,能构成多少种不同的二叉搜索树的方法。通过定义dp[i]表示由i个节点组成的不重复的二叉搜索树的数量,递推公式为dp[i]+=dp[j-1]*dp[i-j],其中j取1到i。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Question

Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?

给出n,可以组成多少个不重复的BST(二叉查找树),其中每个结点的值为1…n

Example

Given n = 3, there are a total of 5 unique BST’s.

question

Solution

  • 动态规划解。为了保证计算得到的BST都是不重复的,我们分别以每个结点(1…n)作为根节点。根据二叉树的特点,大于根节点的结点在其右子树,小于根节点的结点在其左子树。所以我们定义dp[i]:i个结点组成的不重复的BST个数。要计算dp[i],我们只需分别计算以1…i作为根结点时的BST个数,而假设计算以j(j <= i)为根节点的BST个数我们只需要计算其左子树和右子树的BST个数,并将它们相乘即可。所以递推式:dp[i] += dp[j - 1] * dp[i - j] (j <= i),它代表以j为根节点,dp[j - 1]代表其左子树的BST个数(即由j-1个结点能够组成几种BST),dp[i - j]代表其右子树的BST个数。

    
    # 递归版,不能AC,这里只是显示逻辑更易于理解
    
    class Solution(object):
        def numTrees(self, n):
            """
            :type n: int
            :rtype: int
            """
            return self.solve(n)
    
        def solve(self, n):
            if n <= 1: return 1
            ways = 0
            # 分别计算以1...n作为根节点的BST个数
            for i in range(1, n + 1):
                # 每个i作为根结点时的BST个数 = 左子树可以组成的BST个数 * 右子树可以组成的BST个数
                # 其实就是i - 1和n - i个结点能够组成的BST的个数
                ways += self.solve(i - 1) * self.solve(n - i)
            return ways
    class Solution(object):
        def numTrees(self, n):
            """
            :type n: int
            :rtype: int
            """
            if n == 0: return 0
            dp = [0] * (n + 1)
            dp[0] = dp[1] = 1
            for index_n in range(2, n + 1):
                # 分别计算以j为根(j代表1...index_n)的二叉树的个数,并计算总和
                for j in range(1, index_n + 1):
                    dp[index_n] += dp[j - 1] * dp[index_n - j]
            return dp[-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值