• 题目地址(894. 所有可能的真二叉树)


    题目地址(894. 所有可能的真二叉树)

    https://leetcode.cn/problems/all-possible-full-binary-trees/

    题目描述

    给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0 。
    
    答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表。
    
    真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。
    
     
    
    示例 1:
    
    输入:n = 7
    输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]
    
    
    示例 2:
    
    输入:n = 3
    输出:[[0,0,0]]
    
    
     
    
    提示:
    
    1 <= n <= 20
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    前置知识

    公司

    • 暂无

    思路

    关键点

    代码

    • 语言支持:Python3

    Python3 Code:

    
    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
    
        memo = {0:[],1:[TreeNode(0)]}
        def allPossibleFBT(self, n: int) -> List[TreeNode]:
            """
            所有可能真二叉树(每个节点具有0个或2个子节点)
            Args:
                n(int):二叉树节点个数
            Returns:
                真二叉树的根节点列表
            解决办法:
            令FBT(N)作为所有含N个结点的可能的满二叉树的列表。
            每个满二叉树 TT 含有 3 个或更多结点,在其根结点处有 2 个子结点。这些子结点 left 和 right 本身就是满二叉树。
            因此,对于 N≥3,我们可以设定如下的递归策略:FBT(N)= [对于所有的 x,所有的树的左子结点来自 FBT(x) 而右子结点来自FBT(N−1−x)]。
            此外,通过简单的计数参数,没有满二叉树具有正偶数个结点。
            最后,我们应该缓存函数 FBT 之前的结果,这样我们就不必在递归中重新计算它们
            """
            if n not in self.memo:
                ans = []
                for x in range(n):
                    y = n-1-x
                    for left in self.allPossibleFBT(x):
                        for right in self.allPossibleFBT(y):
                            bns = TreeNode(0)
                            bns.left = left
                            bns.right = right
                            ans.append(bns)
                self.memo[n] = ans 
            return self.memo[n]
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    复杂度分析

    令 n 为数组长度。

    • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
    • 空间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 相关阅读:
    【docker】docker安装与优化
    纹波类型及纹波抑制措施
    Java IO包中System.in,System.out,System.err简介说明
    看完这篇SpringBoot让我在阿里成功涨薪40%,感谢
    抢购软件使用方法(如何开发抢购软件)
    Android事件分发机制
    Android 标题栏及导航栏设计与实现
    【技巧】如何快速给每张PPT同时插入不同的图片?
    数据结构-顺序表
    让我们来看看React.memo
  • 原文地址:https://blog.csdn.net/y1040468929/article/details/126032740