LeetCode 热题 HOT 100 第38天:“不同的二叉搜索树”

继续刷LeetCode 热题 HOT 100 的题目,并且在博客更新我的solutions。在csdn博客中我会尽量用文字解释清楚,相关Java代码大家可以前往我的个人博客jinhuaiyu.com中查看。
题目:不同的二叉搜索树
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
在这里插入图片描述
输入:n = 3
输出:5
示例 2:
输入:n = 1
输出:1
提示:
1 <= n <= 19

solution 1:动态规划
二叉搜索树中每个节点的左子树中节点值都比它小,右子树值都比它大。如果我们能讨论出分别以1~n为根节点的不同二叉搜索树数量,那么加起来就是要求的总数。
假设以i(1<=i<=n)为根节点,那么左子树就有i-1个节点,右子树就有n-i个节点,原问题就变成了分别求左右子树各有多少种(注:求i+1~n这n-i个数能组成多少种二叉搜索树其实等价于求1~n-i这n-i个数能组成多少种)。而左右子树又可以继续按上述构建过程拆分,这是一个分治的过程。
假设G(n) 是我们求解需要的函数,易得G(0)=1,G(1)=1(边界情况),我们可以根据上述思想得到递推关系:
在这里插入图片描述
(分别求以1~n为根节点时,左右子树各有多少种,相乘即可,然后把1~n为根节点的二叉搜索树数量相加)
我们可以发现在求解各种子问题的时候,会重复求一些G(i),我们可以利用动态规划的思想,把求解的G(i)都记录下来,减少计算。我们可以利用递归或迭代这两种方法来实现。
递归:对求解n个节点组成不同二叉搜索树的递归函数来说,终止条件就是G(0)和G(1),然后循环计算根节点为1~n时的二叉搜索树数量并相加,在每层循环中求G(i-1)和G(n-i)时,如果之前算过并记录下来了,则直接使用,如果没算过,就递归调用自身方法,参数为i-1或n-i。求出的G(n)都会记录下来。
迭代:G(1)和G(0)已知,直接从G(2)开始计算并填充G[]数组(记录以数组下标为节点数时的二叉搜索树数量),直到求到G(n)。由于求G(i)时,只需要知道G(0)~G(i-1),而这些已经在之前的迭代过程中计算并填充了,所以可以根据公式计算出G(i)。

solution 2:数学递推公式
事实上我们在方法一中推导出的 G(n)G(n)函数的值在数学上被称为卡塔兰数。卡塔兰数更便于计算的定义如下:
在这里插入图片描述
套用递推公式时需要用 long 类型防止计算过程中的溢出。

Finally,带有详细注释的代码放在我的个人博客http://jinhuaiyu.com/leetcode-unique-binary-search-trees/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值