【LeetCode】894. 所有可能的真二叉树

文章目录

    • [894. 所有可能的真二叉树](https://leetcode.cn/problems/all-possible-full-binary-trees/)
          • 思路一:分治
          • 代码:
          • 思路二:记忆化搜索
          • 代码:


894. 所有可能的真二叉树

在这里插入图片描述

思路一:分治

1.递归,n==1 时,创建节点,直接返回

2.一个根有两个结点,所以结点数一定为奇数。如果为偶数,则不能构成该树,直接返回

3.所以结点总数n一定是奇数。左节点数+右结点数 = n-1(1为根节点)

4.当左树结点为i时,右树结点为n-1-i

5.推测出左右树结点分布如下: [(1,n−2),(3,n−4),(5,n−6),⋯,(n−2,1)],遍历的步长为2

6.递归左右树,合并得到的信息

代码:
    //分治public List<TreeNode> allPossibleFBT(int n) {return dfs(n);}private List<TreeNode> dfs(int n) {List<TreeNode> res = new ArrayList<>();if (n == 1) {res.add(new TreeNode(0));//n==1 时,创建节点,直接返回return res;}if (n % 2 == 0) {//一个根有两个结点,所以结点数一定为奇数//如果为偶数,则不能构成该树,直接返回return res;}for (int i = 1; i < n; i += 2) {//结点总数n一定是奇数//左节点数+右结点数 = n-1(1为根节点)//当左树结点为i时,右树结点为n-1-i//推测出:  [(1,n−2),(3,n−4),(5,n−6),⋯,(n−2,1)]List<TreeNode> leftInfo = dfs(i);//左树的信息List<TreeNode> rightInfo = dfs(n - i - 1);//右树的信息for (TreeNode l : leftInfo) {//合并左树和右树的信息for (TreeNode r : rightInfo) {TreeNode node = new TreeNode(0, l, r);res.add(node);}}}return res;}
思路二:记忆化搜索

1.n==1 时,创建节点,直接返回

2.n>1,枚举左子树的结点数量i,右子树的结点数为n-i-1;

3.递归构造左右子树符合真二叉树的所有情况,进行合并

4.记忆化搜索,当不为空时,说明已经计算,直接拿来用。避免重复计算

代码:
    private List<TreeNode>[] f;public List<TreeNode> allPossibleFBT(int n) {f = new List[n + 1];return dfs1(n);}private List<TreeNode> dfs1(int n) {if (f[n] != null) {return f[n];}List<TreeNode> ans = new ArrayList<>();if (n == 1) {ans.add(new TreeNode(0));return f[n] = ans;}for (int i = 0; i < n - 1; i++) {int j = n - 1 - i;for (TreeNode left : dfs1(i)) {for (TreeNode right : dfs1(j)) {ans.add(new TreeNode(0, left, right));}}}return f[n] = ans;}

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

动态规划——线性dp

图片来源&#xff1a;_snowstorm_ 路线问题的状态表示一般都可以用点的坐标来表示 状态表示数组维数的确定原则&#xff1a;在可以用该维数表示出答案的基础上维数尽可能最小 数字三角形 acwing 898 #include<iostream> #include<cstring> #include<algorith…

基于SpringBoot Vue大学生家教管理系统

一、&#x1f4dd;功能介绍 基于SpringBoot Vue大学生家教管理系统 角色&#xff1a;管理员、教师、学生 管理员&#xff1a;管理员进入主页面&#xff0c;主要功能包括对首页、个人中心、学生管理、教师管理、科目管理、家教需求管理、家教预约管理、取消预约管理、通知公告…

项目:自主实现Boost搜索引擎

文章目录 写在前面开源仓库和项目上线其他文档说明 项目背景项目的宏观原理技术栈与环境搜索引擎原理正排索引倒排索引 去标签和数据清洗模块html文件名路径保存函数html数据解析函数文件写入函数 建立索引模块检索和读取信息建立索引建立正排索引建立倒排索引jieba工具的使用倒…

全网短剧搜索前端源码开源分享可改自己的接口

全网短剧搜索前端源码 内含7000短剧资源(不支持在线播放&#xff09; 源码全开源&#xff0c;可以修改成自己的接口 178、226、347行修改 源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/

学习 MongoDB:打开强大的数据库技术大门

一、基本概念 MongoDB 是一个基于分布式文件存储的文档数据库&#xff0c;由 C 语言编写。它旨在为 Web 应用提供可扩展的高性能数据存储解决方案。 相信MySQL我们非常的熟悉&#xff0c;那么MySQL的表结构与MongoDB的文档结构进行类比的话可能更好理解MongoDB。 MySQL的数据…

鸿蒙内核源码分析 (并发并行篇) | 内核如何管理多个 CPU?

理解并发概念 并发&#xff08;Concurrent&#xff09;: 多个线程在单个核心运行&#xff0c;同一时间只能一个线程运行&#xff0c;内核不停切换线程&#xff0c;看起来像同时运行&#xff0c;实际上是线程被高速的切换. 通俗好理解的比喻就是高速单行道&#xff0c;单行道指…

AI预测福彩3D第28弹【2024年4月6日预测--第7套算法重新开始计算第1次测试】

今天开始&#xff0c;咱们开始进行第7套算法的测试&#xff0c;第7套算法将综合012路权重、012路直选及012路和值进行预测。好了&#xff0c;先上图后上结果吧~ 2024年4月6日福彩3D的七码预测结果如下 第一套&#xff1a; 百位&#xff1a;1 2 4 5 7 8…

计算机视觉入门:开启图像理解之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

使用 Docker 部署 Photopea 在线 PS 工具

1&#xff09;Photopea 介绍 GitHub&#xff1a;https://github.com/photopea/photopea 官方手册&#xff1a;https://www.photopea.com/learn/ Adobe 出品的「PhotoShop」想必大家都很熟悉啦&#xff0c;但是「PhotoShop」现在对电脑配置要求越来越高&#xff0c;体积越来越大…

JavaEE初阶——多线程(一)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程的第一部分:引入线程以及创建多线程的几种方式 此文章是建立在前一篇文章进程的基础上的 如果有不足的或者错误的请您指出! 1.认识线程 我们知道现代的cpu大多都是多核心…

5.3 用栈翻转数组,动态规划求斐波那契数列

5.3 用栈翻转数组&#xff0c;动态规划求斐波那契数列 1. 用栈翻转数组 assume cs:code,ds:data,ss:stack data segmentarr dw 1111h,2222h,3333h,4444h,5555h,6666h,7777h,8888hres db 800 dup(0) data endsstack segmentdb 100 dup(0) stack endscode segmentstart:mov ax,…