鱼C论坛

 找回密码
 立即注册
查看: 75|回复: 1

二叉排序树求树个数

[复制链接]
发表于 2024-10-25 09:22:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

答案代码
class Solution:
    def numTrees(self, n: int) -> int:
        stack = [1,1] #f(0):一个空结点;f(1)
        if n <= 1:
            return stack[n]
        for m in range(2,n+1):#总共有n个结点
            count = 0
            for i in range(m): #第m个结点的二叉排序树的左右子树整数和是m-1
                count += stack[i] * stack[m-1-i]
            stack.append(count)
        return stack[n]

为什么
 stack[i] * stack[m-1-i]
左右子树的数量要相乘
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-25 09:23:04 | 显示全部楼层
为了计算由 n 个节点组成的不同二叉搜索树(BST)的数量,我们可以使用动态规划来解决。

设 \( G(n) \) 表示 n 个节点可以组成的二叉搜索树的总数。我们知道:

- \( G(0) = 1 \)(空树也是一种BST)
- \( G(1) = 1 \)(只有一个节点的树)

对于 \( n \geq 2 \),我们可以这样理解:将每个节点从 1 到 n 作为根节点,剩下的节点构成左右子树。假设 \( i \) 是根节点:

- 左子树可以由节点 1 到 \( i-1 \) 组成,有 \( G(i-1) \) 种情况。
- 右子树可以由节点 \( i+1 \) 到 n 组成,有 \( G(n-i) \) 种情况。

因此,总的组合情况为:
\[ G(n) = \sum_{i=1}^{n} G(i-1) \times G(n-i) \]

下面的代码实现了这个逻辑:
class Solution:
    def numTrees(self, n: int) -> 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]

这段代码使用数组 \( G \) 存储每个 \( G(n) \) 的计算结果,循环累加所有可能的左子树和右子树的组合。

希望这个解释和代码对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 12:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表