二叉树个数

问题

求n个节点不同二叉树个数

1个节点
根节点1 1种
1种二叉树

2个节点
根节点1 左节点1 1种(依照1节点的推断)
根节点1 右节点1 1种(依照1节点的推断)
2种二叉树

3个节点
根节点1 左节点0 右节点2 2种(依照2节点的推断)
根节点1 左节点1 右节点1 1种(依照1节点的推断)
根节点1 左节点2 右节点0 2种(依照2节点的推断)
5种二叉树

4个节点
根节点1 左节点0 右节点3 5种(依照3节点的推断)
根节点1 左节点1 右节点2 2种(依照2节点的推断)
根节点1 左节点2 右节点1 2种(依照2节点的推断)
根节点1 左节点3 右节点0 5种(依照4上面的推断)
共14种二叉树
...
n个节点
递归进行累加

Python代码示例

# !/usr/bin/env python
# -*-encoding: utf-8-*-
# author:LiYanwei
# version:0.1

# 求n个节点不同二叉树个数

def count(n):
    # root : 1
    # left : k
    # right : n - 1- k

    
    # s = 0
    # if n == 0:
    #     # 空树
    #     return 1

    s = count.cache.get(n, 0)
    if s:
        return s
    for k in xrange(n):
        s += count(k) * count(n - 1 - k)

    count.cache[n] = s
    return s

# 重复计算优化
count.cache = {0 : 1}

print count(100)

转载于:https://www.cnblogs.com/Py00/p/7726550.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡特兰数是一种组合数学中的数列,常用于计数一些具有特定结构的对象。其中,n个节点的二叉树个数也可以用卡特兰数进行计算。 首先,我们定义一个二叉树BST(n),其中n表示二叉树中节点的个数。我们可以发现,对于BST(0)来说,它是一棵空树,也是唯一的一种情况。对于BST(1),只有一个根节点,也是唯一的一种情况。对于BST(2),我们可以将根节点视为i,左子树中节点个数为i-1,右子树中节点个数为n-i,其中1<=i<=n。这样,我们可以通过递归的方式,将BST(n)的计算问题划分为求解BST(i-1)和BST(n-i)的计算问题,然后将二者的计算结果相乘,再将所有i从1到n的计算结果累加,即可得到BST(n)的结果。 这个过程可以表示为如下的递推公式: BST(0) = 1 BST(1) = 1 BST(n) = BST(0)*BST(n-1) + BST(1)*BST(n-2) + ... + BST(n-1)*BST(0),其中n>=2 通过计算我们可以发现,n个节点的二叉树个数恰好对应了卡特兰数C(n)的结果。因此,n个节点的二叉树个数是卡特兰数。这是因为卡特兰数的定义与BST(n)的递归公式相吻合,并且满足初始条件。卡特兰数是一种具有递归性质的数列,它在计算组合问题中经常出现。 总结起来,n个节点的二叉树个数是卡特兰数,是通过递推公式BST(n) = BST(0)*BST(n-1) + BST(1)*BST(n-2) + ... + BST(n-1)*BST(0)以及初始条件得到的。卡特兰数的计算结果能够准确表示n个节点二叉树个数,这与二叉树的特定结构有关。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值