LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】

LeetCode-894. 所有可能的真二叉树【树 递归 记忆化搜索 动态规划 二叉树】

  • 题目描述:
  • 解题思路一:分治,递归
  • 解题思路二:动态规划。关键思路是如果构造节点数目为 n 的真二叉树,此时可以从节点数目序列为 [(1,n−2),(3,n−5),⋯ ,(n−2,1)]的真二叉树中构成,按照所有可能的组合数进行枚举,即可构造成节点数目为 n 的真二叉树。即左子树分配1,3,5, ... , n-2个节点。
  • 解题思路三:0

题目描述:

给你一个整数 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

解题思路一:分治,递归

如果你要为某节点分配一个左节点,那么一定也要为它分配一个右节点。因此,如果 N 为偶数,那一定无法构成一棵满二叉树。

为了列出所有满二叉树的排列,我们可以为左子树分配 x 节点,为右子树分配 N - 1 - x(其中减 1 减去的是根节点)节点,然后递归地构造左右子树。

x 的数目从 1 开始,每次循环递增数目 2(多增加 2 个节点,等于多增加 1 层)。

递归过程
递归最关心的两个问题是:

  • 结束条件
  • 自身调用

对于这个问题来说,结束条件为:

  • 当 N 为偶数时:无法构造满二叉树,返回空数组
  • 当 N == 1 时:树只有一个节点,直接返回包含这个节点的数组
  • 当完成 N 个节点满二叉树构造时:返回结果数组
    当需要构造左右子树时,就进行自身调用。具体的看代码吧~
# 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:def allPossibleFBT(self, n: int) -> List[Optional[TreeNode]]:res = []if n == 1:return [TreeNode(0)]if n % 2 == 0: # 结点个数必须是奇数return []left_num = 1 # 左子树分配一个节点right_num = n - 2 # 此时n必大于等于3, 右子树可以分配到 n - 1 - 1 = n - 2 个节点while right_num > 0:left_tree = self.allPossibleFBT(left_num) # 递归构造左子树right_tree = self.allPossibleFBT(right_num) # 递归构造右子树# 具体构造过程for i in range(len(left_tree)):for j in range(len(right_tree)):root = TreeNode(0)root.left = left_tree[i]root.right = right_tree[j]res.append(root) # 注意返回的是树的根节点left_num += 2right_num -= 2return res

时间复杂度:O(2n / n \sqrt n n )
空间复杂度:O(n) 递归调用栈

解题思路二:动态规划。关键思路是如果构造节点数目为 n 的真二叉树,此时可以从节点数目序列为 [(1,n−2),(3,n−5),⋯ ,(n−2,1)]的真二叉树中构成,按照所有可能的组合数进行枚举,即可构造成节点数目为 n 的真二叉树。即左子树分配1,3,5, … , n-2个节点。

动规五部曲:定推初遍举

  1. dp定义:所有可能含 n 个节点的 真二叉树
  2. 推导:dp[n] = 节点数目序列为 [(1,n−2),(3,n−5),⋯ ,(n−2,1)]的真二叉树中构成
  3. 初始化:dp[1] = [TreeNode(0)]
  4. 遍历:按照推导公式来for i in range(3, n + 1, 2): for j in range(1, i, 2):
  5. 举例:注意dp[i]是一个列表
# 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:def allPossibleFBT(self, n: int) -> List[Optional[TreeNode]]:if n % 2 == 0: # 结点个数必须是奇数return []dp = [[] for _ in range(n+1)]dp[1] = [TreeNode(0)]for i in range(3, n + 1, 2):for j in range(1, i, 2):for left_tree in dp[j]:for right_tree in dp[i - 1 - j]:root = TreeNode(0, left_tree, right_tree)dp[i].append(root)return dp[n]

时间复杂度:O(2n / n \sqrt n n )
空间复杂度:O(1)返回值不计入空间复杂度。

解题思路三:0


时间复杂度:O(n)
空间复杂度:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588779.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来成都的国际数字影像产业园,开启文创产业园之旅

走进位于成都金牛区福堤路的国际数字影像产业园&#xff0c;仿佛置身于一个充满创意与活力的场域。这里是成都数字产业的聚集地&#xff0c;汇聚了上百家数字媒体相关企业&#xff0c;为成都文创产业注入了新的活力。在这里&#xff0c;你可以感受到浓厚的创新氛围&#xff0c;…

香港科技大学广州|智能制造学域博士招生宣讲会—东北大学专场

时间&#xff1a;2024年4月11日&#xff08;星期四&#xff09;14:00 地点&#xff1a;东北大学南湖校区逸夫楼101室 报名链接&#xff1a;https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾&#xff1a;汤凯 教授/学域主任 跨学科重点研究领域 •工业4.0 •智能传感器、自动光…

数据安全之认识数据库防火墙

文章目录 一、什么是数据库防火墙二、数据库防火墙的主要功能三、数据库防火墙的工作原理四、数据库防火墙如何防护数据库免受SQL注入攻击五、数据库防火墙的部署方式六、数据库防火墙与网络防火墙的关系与区别七、数据库防火墙的应用场景 随着信息技术的快速发展&#xff0c;数…

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html

如何利用Flutter将应用成功上架至iOS平台:详细指南

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

深度解析C语言——预处理详解

对C语言有一定了解的同学&#xff0c;相信对预处理一定不会陌生。今天我们就来聊一聊一些预处理的相关知识。预处理是在编译之前对源文件进行简单加工的过程&#xff0c;主要是处理以#开头的命令&#xff0c;例如#include <stdio.h>、#define等。预处理是C语言的一个重要…

桥式起重机防摇输入整形

资料&#xff1a; 桥式起重机防摇定位控制系统开发&#xff0c;毕江涛 基于输入整形的桥式起重机货物摆动控制策略研究&#xff0c;王冰清 基于输入整形技术的门座起重机吊重摆动控制研究&#xff0c;王云飞 基于变增益 PID 控制的起重机防摇摆设计与仿真&#xff0c;郭瀛舟 ht…

使用Bitmaps位图实现Redis签到

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis提供了Bitmaps这个“数据类型”可以实现对位的操作: (1) Bitmaps…

基于单片机的汽车尾灯控制系统设计

**单片机设计介绍&#xff0c;基于单片机的汽车尾灯控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的汽车尾灯控制系统设计概要主要涵盖利用单片机技术实现对汽车尾灯的智能控制。下面将从系统构成、工作…

RPM与YUM

目录 rpm包的管理 介绍 rpm包的简单查询指令 rpm包名基本格式 rpm包的其他查询指令: 卸载rpm包 yum 介绍 rpm包的管理 介绍 rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat)软件包管…

Flutter应用混淆技术原理与实践

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

【数学公式大全整理——1.0】

导数公式 积分表 万能公式 初等函数 重要极限 ### 诱导公式 和差角 和差化积 倍角公式 半角公式 正弦 余弦定理 反三角函数 高阶求导公式