95. Unique Binary Search Trees II -Meidum

本文介绍了一种使用动态规划方法来生成所有唯一二叉搜索树(BST)的方法,这些BST存储从1到n的整数值。通过将每个节点作为根节点,并递归地构造左子树和右子树,最终生成所有可能的BST结构。

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

Question

Given an integer n, generate all structurally unique BST’s (binary search trees) that store values 1…n.

给出一个整数n,请你生成所有的不重复的BST的结构(即构建树),它的结点值为1…n

Example

Given n = 3, your program should return all 5 unique BST’s shown below.

question

Solution

  • 动态规划解。思路还是之前的思路,把每个结点作为根节点,然后分别计算其左子树和右子树,因为这里要把每种情况都构建出来。所有我们在递归过程中把每棵树都构建出来并加入列表
class Solution(object):
    def generateTrees(self, n):
        """
        :type n: int
        :rtype: List[TreeNode]
        """
        if n == 0: return []
        return self.solve(1, n)

    def solve(self, start, end):
        res = []
        # 如果没有结点了就返回空结点
        if start > end:
            return [None]
        # 如果只有一个结点则直接返回该结点
        if start == end:
            return [TreeNode(start)]
        # 分别以1...n为根节点
        for root_index in range(start, end + 1):
            # 得到左子树列表
            lsubtree = self.solve(start, root_index - 1)
            # 得到右子树列表
            rsubtree = self.solve(root_index + 1, end)
            # 构建树
            for lnode in lsubtree:
                for rnode in rsubtree:
                    root = TreeNode(root_index)
                    root.left = lnode
                    root.right = rnode
                    res.append(root)
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值