Leetcode Hot100不熟练题目 96. 不同的二叉搜索树

1、题目描述

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

在这里插入图片描述
示例 1:
输入:n = 3
输出:5

示例 2:
输入:n = 1
输出:1

提示:
1 <= n <= 19

2、思路及代码

1、动态规划

我们用G[n]代表n个节点可以构成的二叉搜索树的数量。f[i]表示以i为根节点的二叉搜索树数量。

对于给定的n个节点。我们需要的结果就是G[n]。
G[n] = f[1] + f[2] + f[3] + … + f[n],也就是1-n每个数字分别做根节点的元素数量和。
那么我们看f[1]。f[1] 代表1做根节点的元素数量。那么此时,以1为根的左子树节点数量为0,右子树节点数量为n - 1, 也就是(2 到n - 1这些节点)。此时左子树0个节点可以构成的二叉搜索树的数量为G[0], 右子树为G[n - 1]。所以f[1] = G[0] * G[n - 1] 。

同理我们可以得到G[n] = f[1] + f[2] + … + f[n] = G[0] * G[n - 1] + G[1] * G[n - 2] + … + G[n - 1] * G[0]

G[1] = G[0] * G[0]
G[2] = G[0] * G[1] + G[1] * G[0]
G[3] = G[0] * G[2] + G[1] *G[1] + G[2] * G[0]
可以看到G[n] 的求解依赖于G[n -1] ,G[n-2],…G[0]的
所以我们可以从小到大求出所有的G[n]

class Solution {
public:
    int numTrees(int n) {
    	//G数组
        vector<int> g(n + 1);
        // 0个节点只能组成一种二叉搜索树(空树)
        g[0] = 1;
        //从1到n进行计算
        for(int i = 1; i <= n; i ++)
        {
            for(int j = 1; j <= i; j ++)
            {
                g[i] += g[j - 1] * g[i - j];
            }
        }
        return g[n];
    }
};

2、卡特兰数

由上式可以推导出卡特兰数
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int numTrees(int n) {
       long long ans = 1;
       for(int i = 0; i < n; i ++)
       {
           ans = ans * 2 * (2 * i + 1) / (i + 2); 
       }
       return (int) ans;
    }
};

参考资料

https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/
https://zh.wikipedia.org/wiki/卡塔兰数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值