题目地址(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

前置知识

公司

  • 暂无

思路

关键点

代码

  • 语言支持: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]



复杂度分析

令 n 为数组长度。

  • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值