栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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/卡塔兰数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号