什么是卡特兰数卡塔兰数

卡塔兰数(又叫卡特兰数),那么这个与斐波那切数列齐名我们却很陌生的数列到底是什么?本期所用的树的数据结构均如下:

class TreeNode {
    int val;
    TreeNode left; 
    TreeNode right;
    TreeNode(int x) { val = x; }
}
  1. 不同的二叉搜索树【中等题】

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

题目详解

【解题思路】

这道题其实是一道找规律的题,n分别为 1,2,3 的情况如下所示。
在这里插入图片描述
这道题的规律在于,[1,n]这n个数都可以作为根结点,而当i成为根节点时,以i为根节点的二叉搜索树的个数就是[1,i-1]形成二叉搜索树的个数乘以[i+1,n]形成二叉搜索树的个数。具体做法如下:

  1. 把 n = 0 时赋为1,即dp[0]=1
  2. n = 1 时,只有一个根节点1,此时左边节点数=0,右边节点数=0, d p [ 1 ] = d p [ 0 ] ∗ d p [ 0 ] = 1 dp[1]=dp[0]*dp[0]=1 dp[1]=dp[0]dp[0]=1
  3. n = 2 时,根节点可以为1或者2,为1时左边节点数=0,右边节点数=1;为2时左边节点数=1,右边节点数=0, d p [ 2 ] = d p [ 0 ] ∗ d p [ 1 ] + d p [ 1 ] ∗ d p [ 0 ] = 2 dp[2]=dp[0]*dp[1]+dp[1]*dp[0]=2 dp[2]=dp[0]dp[1]+dp[1]dp[0]=2
  4. n = 3 时,根节点可以为1或者2或者3,为1时左边节点数=0,右边节点数=2;为2时左边节点数=1,右边节点数=1;为3时左边节点数=2,右边节点数=0, d p [ 3 ] = d p [ 0 ] ∗ d p [ 2 ] + d p [ 1 ] ∗ d p [ 1 ] + d p [ 2 ] ∗ d p [ 0 ] = 3 dp[3]=dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]=3 dp[3]=dp[0]dp[2]+dp[1]dp[1]+dp[2]dp[0]=3

由此可以得出卡塔兰数列的递推式为:
C n + 1 = ∑ i = 0 n C i C n − i n > 0 C_{n+1}=\sum_{i=0}^nC_iC_{n-i} \qquad n>0 Cn+1=i=0nCiCnin>0

【详细代码】
public int numTrees(int n) {
    int [] G = new int[n+1];
    G[0] = G[1] = 1;
    for(int i=2; i<=n; ++i) {
        for(int j=0; j<i; ++j) {
            G[i] += G[j] * G[i-j-1];
        }
    }
    return G[n];
}

帮到你了吗,点在看吧♥◠‿◠ノ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值