欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python 递归--给出n个节点计算可以组合成几种二叉树(附代码)

程序员文章站 2024-01-18 15:07:22
问题:给出n个节点可以组合成多少种二叉树?当给出一个节点的时候: n = 1,仅仅有一个二叉树当给出两个节点的时候:n = 2,可以组成两个二叉树当给出三个节点的时候:n = 3, 可以组成5个二叉树方式一:使用卡特兰数进行递归推导当n = 1时,只有一个root节点,所以也仅仅能够组合成1种形态的二叉树,也就是可以表示成h(1)=1h(1) = 1h(1)=1当n = 2时,有一个root节点,此外还有一个节点,当然,这个节点既可以做左子树也可以做右子树h(2)=h(0)∗h(1)+h...

问题:给出n个节点可以组合成多少种二叉树?

当给出一个节点的时候: n = 1,仅仅有一个二叉树
python  递归--给出n个节点计算可以组合成几种二叉树(附代码)
当给出两个节点的时候:n = 2,可以组成两个二叉树

python  递归--给出n个节点计算可以组合成几种二叉树(附代码)
当给出三个节点的时候:n = 3, 可以组成5个二叉树
python  递归--给出n个节点计算可以组合成几种二叉树(附代码)


方式一:使用卡特兰数进行递归推导

当n = 1时,只有一个root节点,所以也仅仅能够组合成1种形态的二叉树,也就是可以表示成h(1)=1h(1) = 1

当n = 2时,有一个root节点,此外还有一个节点,当然,这个节点既可以做左子树也可以做右子树h(2)=h(0)h(1)+h(1)h(0)=2h(2) = h(0)*h(1) + h(1)*h(0) = 2

当n = 3 时,一个root节点固定,此外还有两个节点,即:h(3)=h(0)h(2)+h(1)h(1)+h(2)h(0)=5h(3) = h(0)*h(2) + h(1)*h(1)+h(2)*h(0) = 5

这样可以一次类推:当n>=2的时候,可以推导出:

h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)h(n) = h(0) * h(n-1) + h(1)*h(n-2)+...+h(n-1)*h(0)

以上的推导符合卡特兰斯数

因而我们可以得到递推公式为(也是卡特兰数的递推公式):

h(n)=h(n1)(4n2)/(n+1)h(n)=h(n-1)*(4*n-2)/(n+1)


实现代码:

def bt(n, buffer={}):
    if n < 2:
        return 1
    return bt(n - 1) * (4 * n - 2) / (n + 1)
   
if __name__ == '__main__':
   for i in range(1, 20+1):
       print(i, int(bt(i)))

打印结果如下:

1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
16 35357670
17 129644790
18 477638700
19 1767263190
20 6564120420

方法二

我们可以通过上图可以看出,二叉树的形成就是一个排列组合的问题

比如拿5个节点的二叉树举例

我们去掉根节点后,还剩四个节点,这四个节点,我们可以按照如下的方式进行分配:

  1. 左边没有节点,右边四个节点
  2. 左边一个节点,右边三个节点
  3. 左边两个节点,右边两个节点
  4. 左边三个节点,右边一个节点
  5. 左边四个节点,右边没有节点

代码如下:

def bt(n, buffer={}):
    if n < 2:
        return 1
        
    if n in buffer:
        return buffer[n]

    n -= 1
    result = 0
    for left in range(n+1):
        result += bt(left, buffer) * bt(n - left, buffer)

    buffer[n+1] = result
    return result


if __name__ == '__main__':
    for i in range(1, 39+1):
        print(i, int(bt(i)))

运行结果如下:

1 1
2 2
3 5
4 14
5 42
6 132
7 429
8 1430
9 4862
10 16796
11 58786
12 208012
13 742900
14 2674440
15 9694845
16 35357670
17 129644790
18 477638700
19 1767263190
20 6564120420
21 24466267020
22 91482563640
23 343059613650
24 1289904147324
25 4861946401452
26 18367353072152
27 69533550916004
28 263747951750360
29 1002242216651368
30 3814986502092304
31 14544636039226908
32 55534064877048192
33 212336130412243104
34 812944042149730688
35 3116285494907300864
36 11959798385860452352
37 45950804324621737984
38 176733862787006693376
39 680425371729975836672

本文地址:https://blog.csdn.net/qq_38973721/article/details/107155565