LeetCode 96. 不同的二叉搜索树 C++卡特兰数解决
发布日期:2021-05-08 02:33:16 浏览次数:26 分类:精选文章

本文共 797 字,大约阅读时间需要 2 分钟。

给定一个整数n,求以1到n为节点组成的二叉搜索树的数量。这个问题可以通过卡特兰数来解决,具体步骤如下:

  • 理解问题:二叉搜索树的特点是左子树的所有节点值都小于父节点,而右子树的所有节点值都大于父节点。对于给定的n个节点,所有可能的二叉搜索树的数量即为问题所求。

  • 卡特兰数:卡特兰数常用于解决类似的问题,如有效括号序列、栈操作序列等。第n个卡特兰数记为C_n,计算公式为:[C_n = \frac{1}{n+1} \binom{2n}{n}]这个数与二叉搜索树的数量有关。

  • 计算卡特兰数:使用递推公式或直接计算公式来计算卡特兰数。这里使用直接计算公式:[C_n = \frac{(2n)!}{(n+1)! \cdot n!}]为了避免计算阶乘带来的大数问题,可以逐步计算:[C_n = \prod_{i=1}^{n} \frac{2i - 1}{i}]

  • 编写代码:根据上述公式编写代码计算卡特兰数。由于结果可能很大,使用long long类型存储。

  • 以下是优化后的代码:

    #include 
    using namespace std;long long catalan(int n) { if (n == 0) return 1; long long res = 1; for (int i = 1; i <= n; ++i) { res *= (2 * i - 1); res /= i; } return res;}long long numTrees(int n) { if (n == 0 || n == 1) return 1; return catalan(n);}

    输入样例:3

    输出样例:5

    解释:当n=3时,卡特兰数C_3=5,与二叉搜索树的数量相符。代码通过递推计算卡特兰数,返回正确的结果。

    上一篇:Unity Shader之路(三)Unity Shader的结构?
    下一篇:Unity Shader之路(一)什么是Unity Shader?

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月05日 08时24分03秒