m0_70197485 2022-04-26 13:42 采纳率: 0%
浏览 112
已结题

求N个结点的二叉树所有形态,可以给个思路吗

要求放在图片里面,我的疑惑是在不构建二叉树

img


的情况下,怎么才能输出正确的序列?

  • 写回答

2条回答 默认 最新

  • 不会长胖的斜杠 后端领域新星创作者 2022-04-26 14:16
    关注

    1)先考虑只有一个节点的情形,设此时的形态有f(1)种,那么很明显f(1)=1

    (2)如果有两个节点呢?我们很自然想到,应该在f(1)的基础上考虑递推关系。那么,如果固定一个节点后,左右子树的分布情况为1=1+0=0+1,故有f(2) = f(1) + f(1)

    (3)如果有三个节点,(我们需要考虑固定两个节点的情况么?当然不,因为当节点数量大于等于2时,无论你如何固定,其形态必然有多种)我们考虑固定一个节点,即根节点。好的,按照这个思路,还剩2个节点,那么左右子树的分布情况为2=2+0=1+1=0+2。
    所以有3个节点时,递归形式为f(3)=f(2) + f(1)*f(1) + f(2)。(注意这里的乘法,因为左右子树一起组成整棵树,根据排列组合里面的乘法原理即可得出)

    (4)那么有n个节点呢?我们固定一个节点,那么左右子树的分布情况为n-1=n-1 + 0 = n-2 + 1 = … = 1 + n-2 = 0 + n-1。此时递归表达式为f(n) = f(n-1) + f(n-2)f(1) + f(n-3)f(2) + … + f(1)f(n-2) + f(n-1)

    接下来我们定义没有节点的情况,此时也只有一种情况,即f(0)=1
    那么则有:
    f(0)=1,f(1)=1
    f(2)=f(1)f(0)+f(0)f(1)
    f(3)=f(2)f(0)+f(1)f(1)+f(0)f(2)

    
    class Solution:
        def orderMultiply(self, x):
            if x == 0:
                return 1
            else:
                return x * self.orderMultiply(x-1)
        
        def getStateofBinaryTree(self, n):
            if n == 0:
                return
            elif n == 1:
                return 1
            else:
                return self.orderMultiply(2*n) / self.orderMultiply(n) / self.orderMultiply(n+1)
     
    n = 3
    answer = Solution()
    print(answer.getStateofBinaryTree(n)
    

    可以参考下,有帮助的话采纳一下,谢谢!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月27日
  • 修改了问题 4月26日
  • 修改了问题 4月26日
  • 修改了问题 4月26日
  • 展开全部

悬赏问题

  • ¥15 mysql将查询的结果作为动态列名怎么实现
  • ¥50 python自动地图截图脚本
  • ¥15 悬赏一本书(内含Matlab代码)的书名、作者
  • ¥20 瑞萨RA4M1芯片刷写为arduino r4 minima
  • ¥15 前端vue跟后端java服务部署在线上阿里云服务器
  • ¥15 fastreport怎么判断当前页数
  • ¥15 Kylin-Desktop-V10-GFB-Release-JICAI_02- 2207-Build14-ARM64.iso有没有这个版本的系统啊
  • ¥15 能不能通过蓝牙将传感器数据传送到手机上
  • ¥20 100元python和数据科学实验项目
  • ¥15 根据时间在调用出列表