96. 不同的二叉搜索树 Python
创始人
2025-06-01 16:24:44
0

文章目录

  • 一、题目描述
      • 示例 1
      • 示例 2
  • 二、代码
  • 三、解题思路


一、题目描述

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

示例 1

在这里插入图片描述

输入:n = 3
输出:5

示例 2

输入:n = 1
输出:1

提示:1 <= n <= 19

二、代码

代码如下:

class Solution:def numTrees(self, n: int) -> int:result = [1, 1]  # n=0时 有1种情况, n=1时,也只有1种情况if n <= 1:return result[n]for m in range(2, n + 1):s = m - 1count = 0for i in range(m):count += result[i] * result[s - i]result.append(count)print(result[n])return result[n]

三、解题思路

本题需要找到所有可能的二叉搜索树的总个数,提供的二叉树结点是长度为n的连续自然数数组,我们希望能找到n取不同值时二叉搜索树总数,找到他们之间的一个规律,现本题解将发现规律进行展示:
我们假设f(n)为长度为n的连续自然数数组对应的二叉搜索树的总个数,则f(n)可以表示为:
先从最基础的情况开始看,
我们不难理解n=0(即空树)、n=1时二叉搜索树可能的情况只可能是1种(即f(0)=1,f(1)=1)
在n=2时我们也能很快知道二叉搜索树可能的情况只有2种(即f(2)=2)
当n=3时,我们可以选择任意的点作为根节点,然后在根节点左边的数被拿去构造左子树,在根节点右边的数被拿去构造右子树;
例如:n=3 时的数组为[1,2,3],
我们此时拿1作为根节点,则根节点左边的数[]拿去构造左子树,根节点右边的数[2,3]拿去构造右子树
此时左边的数[]长度为0,它只可能有1种情况,即f(0)=1;
而右边的数[2,3]长度为2,它则有可能有2种情况,即f(2)=2,
此时我们就可以用上之前求出来的基础结果了,因为左子树的构建和右子树的构建是独立互不影响的,所以他们所可能组成的结果总数为 f(0)f(2) = 2种
当然,因为我们是随机选择某个数作为根节点,所以还可能存在根节点为2,3的情况,以2为根节点为例,此时左边的数为[1],右边的数为[3],我们分别用它们去构建左、右子树,
此时左边的数[1]长度为1,它只可能有1种情况,即f(1)=1;
而右边的数[3]长度为1,它则有可能有1种情况,即f(1)=1;
则当根节点为2时,可能构成的结果数量为 f(1)*f(1) = 1种
同理,当我们选择3作为根节点时,可能构成的结果为 f(2)*f(0) = 2种
当我们加上以上所有结果后,我们就能知道n=3时的结果:
f(3) = f(0)f(2) + f(1)f(1) + f(2)f(0) = 2 + 1 + 2 = 5种
相同的,我们要求n=4时二叉搜索树的总数:
f(4) = f(0)f(3) + f(1)f(2) + f(2)f(1) + f(3)f(0) = 5 + 2 + 2 + 5 = 14种

所以当长度为n时,公式如下:
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + f(2)*f(n-3) +… + f(n-3)*f(2) + f(n-2)*f(1) + f(n-1)*f(0)
最后化简就是我们求得的公式。
这样我们就可以从头开始慢慢计算后面的结果,每一次都会用上之前求得的答案。

相关内容

热门资讯

最新或2023(历届)关于国庆...   小朋友们,我愿我的祝福是小溪,悄悄地流淌在朋友的心上,绵绵不绝;我愿我的关怀是枫叶,轻轻地摇着秋...
最新或2023(历届)关于国庆...   小朋友们大家早上好啊,大家知道为什么要把十月一号定位国庆节呢,并不是中华人民共和国是在这一天建立...
最新或2023(历届)十一国庆...   大家早上好啊,也许在我们每个人的嘴上不是经常说着自己的祖国,可是我相信在我们的心中祖国永远都是很...
最新或2023(历届)最好的国...   每一阵清风细雨,都会让我将你轻轻想起;每一条祝福,都会将我们的心靠得更近;恰逢国庆之际,借此送上...
最新或2023(历届)关于国庆...   国庆节就是一个国家的节日。我们国家的国庆节是哪一天小朋友们知道吗?是农历的十月一日哦,大家会有很...
最新或2023(历届)最好的国...   小朋友们早上好啊,大家觉得在国庆的时候必不可少的是什么,当然是升国旗了,国庆节的时候都会在现在我...
最新或2023(历届)小学生国...   从1949年的中华人民共和国成立到现在,中华人民共和国已经走过了65年的风风雨雨,经过改革开放三...
最新或2023(历届)十一国庆...   国庆节是每个国家的重要节日,但是每个国家的叫法各有不同,有的国家叫国庆节或者是国庆日,还有一些国...
最新或2023(历届)关于国庆...   看到飞舞的五星红旗,大家知道五星红旗是谁设计的吗?是曾联松先生,他的设计稿从全国设计稿中脱颖而出...
最新或2023(历届)十一国庆...   大家早上啊,以前在国际上要是有人说自己是中国人,迎来的肯定是嘲讽和讽刺,但是现在你可以勇敢和骄傲...
关于五一放假的通知公告 杭州中... 劳作创造了前史,劳作创造了将来。下面小编为你精心收拾了几篇五一放假的告诉,期待阅览!  五一放假的告...
关于最新或2023(历届)五一... 五一劳作节即将来临,它是全国际劳作人民一起具有的节日,下面小编为你精心收拾了几篇五一放假的告诉,期待...
最新或2023(历届)学校5.... 中国人民庆祝劳动节的活动可追溯至1918 年。下面小编为你精心整理了几篇五一放假的告诉,欢迎阅览! ...
物业五一放假有通知吗 物业放假... 物业公司五一放假吗?下面小编为你精心整理了几篇五一放假的告诉,期待阅览!  五一放假的告诉【一】  ...
最新或2023(历届)国际劳动...  五一劳作节即将来临,它是全世界劳作人民一起具有的节日,下面小编为你精心收拾了几篇五一放假的告诉,期...
今年怎么写五一放假的通知公告 ...  五一要来了,如何写好一份放假告诉?下面小编为你精心整理了几篇五一放假的告诉,欢迎阅览!  五一放假...
最新或2023(历届)学校五一... 如何写好一份放假告诉?下面小编为你精心整理了几篇五一放假的告诉,期待阅览!  五一放假的告诉【一】 ...
最新或2023(历届)五四青年...  青年节放假告诉一  依照国务院发布的《全国年节及纪念日放假方法》的规则,“青年节(5月4日),14...
关于最新或2023(历届)五四... 五四青年节源于我国1919年反帝爱国的“五四运动”,以下是芒果教育网小编网罗的青年节放假告诉,期待参...
关于青年节学校安排放假通知 五...  青年节放假告诉一  各单位:  依据国务院《全国年节及纪念日放假方法》精力,现就五四青年节放假组织...