LeetCode 96. 不同的二叉搜索树

96. 不同的二叉搜索树

题目描述

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

解题思路

假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则
G(n) = f(1) + f(2) + f(3) + f(4) + … + f(n)

当 i 为根节点时,其左子树节点个数为 i-1 个,右子树节点为 n-i,则
f(i) = G(i-1)*G(n-i)f(i)=G(i−1)∗G(n−i)

综合两个公式可以得到 卡特兰数 公式:
G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+…+G(n−1)∗G(0)

思路一: 动态规划

/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function(n) {
    let G = Array(n + 1).fill(0);
    G[0] = 1;
    G[1] = 1;
    
    for(let i = 2; i <= n; i++)
        for(let j = 1; j <= i; j++) 
            G[i] += G[j-1] * G[i-j];
    
    return G[n]; 
};
  • 时间复杂度 : O( n 2 n^2 n2) ,其中 n 表示二叉搜索树的节点个数。G(n) 函数一共有 n 个值需要求解,每次求解需要 O(n) 的时间复杂度,因此总时间复杂度为 O( n 2 n^2 n2)

  • 空间复杂度 : O(n)

思路二: 数学公式

C 0 = 1 , C n + 1 = 2 ( 2 n + 1 ) n + 2 C n C_0 = 1, C_{n+1} = {2(2n + 1)\over n + 2}C_n C0=1,Cn+1=n+22(2n+1)Cn

实现代码如下:

/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function(n) {
    let C = 1;
    for (let i = 0; i < n; ++i) {
        C = C * 2 * (2 * i + 1) / (i + 2);
    }
    return C;
}; 
  • 时间复杂度 : O(n) ,其中 n 表示二叉搜索树的节点个数。我们只需要循环遍历一次即可。
  • 空间复杂度 : O(1)

参考资料

https://leetcode.cn/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值