当前位置: 首页 > article >正文

【LeetCode刷题日记】一口气搞定三道层序遍历!从N叉树到二叉树,BFS核心思想一网打尽

个人主页北极的代码欢迎来访作者简介java后端学习者❄️个人专栏苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺前言这一章节我们继续刷二叉树的层序遍历的相关题目。摘要本文探讨了二叉树层序遍历的三种变式问题N叉树层序遍历、每层最大值查找和填充右节点指针。对于N叉树通过遍历子节点列表替代二叉树的左右节点判断查找每层最大值时需注意负数情况填充右指针则通过记录前驱节点建立连接。三种解法均基于队列实现层序遍历核心思想相似但处理细节不同。文章提供了Java代码实现并强调了不同数据结构间的处理差异展示了层序遍历的灵活应用。题目背景492.N叉树的层序遍历给定一个 N 叉树返回其节点值的层序遍历。即从左到右逐层遍历。树的序列化输入是用层序遍历每组子节点都由 null 值分隔参见示例。示例 1输入root [1,null,3,2,4,null,5,6]输出[[1],[3,2,4],[5,6]]示例 2输入root [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]输出[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]提示树的高度不会超过1000树的节点总数在[0, 104]之间题目分析关于这一题我们拿到题目一眼就是层序遍历因为题目的要求就是我们很自然的想到了前面我们学习的二叉树的层序遍历这里有点不一样但是整体思路肯定是一样的不必多说那么变化的地方肯定就在不一样的地方了原来的是 二叉树而这里是N所以代码主要变化的就是这一部分。然后我们分析每个根节点有两个子节点左右节点和每个根节点有N个子节点的具体差别。首先根节点的遍历没问题在进入while循环时我们把每层的节点记录到一个集合中之后我们在二叉树中是通过两个条件判断来添加左右子节点的这里显然就不行了我们不知道有多少个子节点这是又需要一个循环了本质是一样的只是表达方式不同二叉树N叉树子节点存储方式两个单独的变量left和right一个列表children入队操作分别判断left和right是否非空遍历列表把每个子节点入队本质把子节点加入队列把子节点加入队列所以N叉树的这个for循环等价于二叉树的这两行javaif (node.left ! null) queue.offer(node.left); // 处理左子节点 if (node.right ! null) queue.offer(node.right); // 处理右子节点只是因为N叉树的子节点数量不固定可能有0个、2个、5个、10个...所以必须用循环遍历children列表把每一个子节点都加入队列。text二叉树 1 / \ 2 3 处理节点1时 - 判断 left(2) ! null → 入队 - 判断 right(3) ! null → 入队 → 一共2次判断 N叉树 1 / | \ 2 3 4 处理节点1时 - 遍历 children [2,3,4] - 2入队3入队4入队 → 一共3次入队次数取决于子节点数量两者做的是一模一样的事把当前节点的所有非空子节点加入队列供下一层遍历使用。题目答案/* // Definition for a Node. class Node { public int val; public ListNode children; public Node() {} public Node(int _val) { val _val; } public Node(int _val, ListNode _children) { val _val; children _children; } }; */ class Solution { public ListListInteger levelOrder(Node root) { ListListInteger resultnew ArrayList(); if(rootnull){ return result; } QueueNode quenew LinkedList(); que.offer(root); while(!que.isEmpty()){ ListInteger levelnew ArrayList(); int lenque.size(); for(int i0;ilen;i){ Node nodeque.poll(); level.add(node.val); for(Node child:node.children){ if(child!null){ que.offer(child); } } } result.add(level); } return result; } }题目背景515.在每个树行中找最大值给定一棵二叉树的根节点root请找出该二叉树中每一层的最大值。示例1输入:root [1,3,2,5,3,null,9]输出:[1,3,9]示例2输入:root [1,2,3]输出:[1,3]提示二叉树的节点个数的范围是[0,104]-231 Node.val 231 - 1题目分析这个题目也是在层序遍历的基础上进行的变式我们要求的是每层的最大值首先就要把每层的节点数记录下来然后遍历每一层的节点在循环中更新每一层的最大值之后添加到结果集。maxVal Math.max(maxVal, node.val);这里我们一开始设置的最大值的初值不能是0因为节点可能会有负数因此我们设置Integer.MIN_VALUE -2147483648。题目答案/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val val; * this.left left; * this.right right; * } * } */ class Solution { public ListInteger largestValues(TreeNode root) { ListInteger resultnew ArrayList(); if (root null) { return result; } QueueTreeNode queue new LinkedList(); queue.offer(root); while (!queue.isEmpty()) { int levelSize queue.size(); int maxVal Integer.MIN_VALUE; // 因节点可能为负数不能用0 for (int i 0; i levelSize; i) { TreeNode node queue.poll(); maxVal Math.max(maxVal, node.val); // 将子节点加入队列与N叉树的区别二叉树只有左右两个子节点 if (node.left ! null) { queue.offer(node.left); } if (node.right ! null) { queue.offer(node.right); } } result.add(maxVal); } return result; } }题目背景116.填充每个节点的下一个右节点给定一个完美二叉树其所有叶子节点都在同一层每个父节点都有两个子节点。二叉树定义如下struct Node { int val; Node *left; Node *right; Node *next; }填充它的每个 next 指针让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点则将 next 指针设置为NULL。初始状态下所有 next 指针都被设置为NULL。示例 1输入root [1,2,3,4,5,6,7]输出[1,#,2,3,#,4,5,6,7,#]解释给定二叉树如图 A 所示你的函数应该填充它的每个 next 指针以指向其下一个右侧节点如图 B 所示。序列化的输出按层序遍历排列同一层节点由 next 指针连接# 标志着每一层的结束。示例 2:输入root []输出[]题目解析这道题目实际上是链表的相关操作通过指针把同一层的不相干的节点建立了联系记录位置prev curr记住当前节点在哪下次要用构建关系prev.next curr让上一个节点指向当前节点两个动作配合先用prev记住上一个节点的位置再用prev找到上一个节点建立连接然后prev移到当前位置准备下一次连接prev null → 手里没东西 遇到第1家 Aprev A 记住A的位置 遇到第2家 B用记住的A位置告诉A你的下一家是B prev B 改为记住B的位置 遇到第3家 C用记住的B位置告诉B你的下一家是C prev C 改为记住C的位置题目答案/* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(int _val) { val _val; } public Node(int _val, Node _left, Node _right, Node _next) { val _val; left _left; right _right; next _next; } }; */ class Solution { public Node connect(Node root) { if(rootnull){ return null; } QueueNode quenew LinkedList(); que.offer(root); while(!que.isEmpty()){ int lenque.size(); Node prenull; for(int i0;ilen;i){ Node curque.poll(); if(pre!null){ pre.nextcur; } precur; if(cur.left!null){ que.offer(cur.left); que.offer(cur.right); } } } return root; } }结语如果对你有帮助请点赞关注收藏你的支持就是我最大的鼓励

相关文章:

【LeetCode刷题日记】一口气搞定三道层序遍历!从N叉树到二叉树,BFS核心思想一网打尽

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

Lazytainer:基于模糊匹配的Docker容器智能管理工具实战

1. 项目概述:一个为容器化工作流“减负”的智能工具如果你和我一样,日常工作中需要频繁地与Docker容器打交道,那么你一定对下面这些场景深有感触:为了调试一个服务,你得先docker ps找到容器ID,再docker exe…...

视觉触觉融合的机器人可变形物体追踪技术

1. 视觉触觉模仿学习在可变形物体追踪中的技术解析在机器人操作领域,可变形物体(如电缆、布料等)的追踪一直是个棘手问题。这类物体具有近乎无限的自由度,传统方法往往需要精确建模物体动力学特性,难以适应不同几何形状…...

从Airflow到Flyte:新一代云原生MLOps编排平台的核心优势与实践

1. 从Airflow到Flyte:为什么我们需要新一代的MLOps编排器?如果你在数据科学或机器学习工程领域摸爬滚打超过三年,大概率用过或者至少听说过Airflow。它几乎是过去十年里任务编排领域的代名词,用Python写DAG,用Celery做…...

GPIO端口扩展器在翻盖手机中的设计与应用

1. GPIO端口扩展器在翻盖手机中的核心价值翻盖手机的设计一直面临着空间和成本的严格限制。作为硬件工程师,我们经常需要在有限的主板面积上实现尽可能多的功能。GPIO端口扩展器正是解决这一矛盾的利器。通过IC或SPI接口,单个GPIO扩展器可以提供8-16个额…...

HTML函数工具是否支持雷蛇等游戏外设_RGB同步汇总【汇总】

HTML无法直接控制雷蛇等外设RGB灯光,需通过Razer Chroma SDK Web API、WebSocket本地代理或Electron封装调用原生模块实现;其他品牌如罗技、海盗船、华硕亦需各自SDK与手动启用API权限。如果您希望在网页开发中通过HTML函数工具实现雷蛇等游戏外设的RGB灯…...

AdamW与Muon优化器在FFN中的谱崩溃对比研究

1. 项目背景与问题定义在深度神经网络训练过程中,优化器的选择直接影响模型收敛速度和最终性能。AdamW和Muon作为两种主流的自适应优化算法,在各类神经网络结构中表现出不同的特性。本项目聚焦于它们在Feed-Forward Network(FFN)层…...

SenCache:扩散模型推理加速技术解析

1. 项目概述SenCache是一种针对扩散模型(Diffusion Models)的推理加速技术,其核心思想是通过分析模型对不同输入区域的敏感性差异,实现计算资源的动态分配。这项技术特别适合需要实时生成高质量图像的场景,比如游戏内容…...

Gemini CLI扩展开发:构建标准化AI工作流提升开发效率

1. 项目概述:一个为Gemini CLI深度定制的命令集 如果你和我一样,日常开发工作重度依赖命令行,并且最近开始尝试用Gemini CLI来提升效率,那你可能已经发现了一个痛点:原生的 gemini 命令虽然强大,但面对一…...

OpenClaw VS Code扩展:AI辅助编码与安全审计的深度集成实践

1. 项目概述:OpenClaw VS Code 扩展如果你和我一样,每天大部分时间都泡在 VS Code 里,同时又在探索如何让 AI 更深度地融入开发工作流,那么 OpenClaw 这个 VS Code 扩展绝对值得你花时间研究。它不是一个简单的聊天机器人插件&…...

ClawSwap SDK:一站式DEX聚合器集成方案与实战指南

1. 项目概述:一个为去中心化交易聚合而生的SDK最近在开发一个需要深度集成去中心化交易(DEX)功能的项目,我花了不少时间研究市面上的各种工具。在这个过程中,我发现了WarTech9/clawswap-sdk这个仓库。简单来说&#xf…...

Python 正则表达式实战:从入门到精通

Python 正则表达式实战:从入门到精通 引言 大家好,我是一名正在从Rust转向Python的后端开发者。在日常开发中,字符串处理是必不可少的环节,而正则表达式就是处理字符串的一把利器。作为从Rust过来的开发者,我发现Pyt…...

GameVault Inspector:开源游戏库元数据自动化同步工具实战指南

1. 项目概述与核心价值最近在折腾游戏库管理的时候,发现了一个挺有意思的开源项目,叫game-vault-inspector。乍一看名字,你可能会觉得它是个游戏“金库”的检查工具,实际上,它瞄准的是一个更具体、更“硬核”的痛点&am…...

基于模块化设计的AI聊天机器人框架:从核心原理到生产部署

1. 项目概述:一个开箱即用的AI聊天机器人框架最近在GitHub上闲逛,发现了一个叫marcusschiesser/ai-chatbot的项目,点进去一看,好家伙,又是一个AI聊天机器人。这年头,基于大语言模型(LLM&#xf…...

Rust FFI与C交互:跨语言编程实践

Rust FFI与C交互:跨语言编程实践 引言 大家好,我是一名正在从Rust转向Python的后端开发者。在实际项目中,我们经常需要与其他语言进行交互,特别是C语言。Rust提供了强大的FFI(Foreign Function Interface&#xff09…...

轻量级SFT框架SWE-Lego:高效解决软件工程任务

1. 项目背景与核心价值去年在参与一个大型企业级代码审查系统开发时,我们团队遇到了一个典型困境:传统的监督微调(SFT)方法在解决复杂软件工程问题时,要么需要庞大的计算资源,要么难以保持专业领域的准确性。正是这次经历让我开始…...

LLSA:高效稀疏注意力机制在长序列处理中的应用

1. 从密集到稀疏:注意力机制的计算效率革命在自然语言处理和计算机视觉领域,注意力机制已经成为现代深度学习架构的核心组件。传统注意力机制(如Transformer中的自注意力)虽然功能强大,但其计算复杂度随着序列长度呈二…...

QClaw自动化脚本:一键集成Crazyrouter路由与GPT-5.4模型

1. 项目概述:一键切换QClaw路由的自动化脚本如果你正在使用QClaw,并且对内置的qclaw/modelroute路由方案感到性能或稳定性上有所不足,想要尝试更灵活、功能更强大的第三方路由服务,那么你很可能已经听说过crazyrouter.com。这是一…...

LLSA稀疏注意力机制:从原理到工程实践

1. 从密集到稀疏:注意力机制的效率革命在自然语言处理领域,注意力机制早已成为Transformer架构的核心组件。但传统自注意力机制那O(n)的复杂度,就像一场永远无法避免的交通拥堵——随着序列长度增加,计算资源消耗呈平方级增长。三…...

Echo-Server:HTTP请求调试与API模拟的轻量级Docker工具

1. 项目概述:一个为开发者而生的“回音壁”服务器在开发和运维的日常工作中,我们经常需要一个简单、可控的服务器来模拟后端行为,用于测试、调试或演示。无论是验证客户端的网络请求是否正常发送,还是模拟一个API接口返回特定的状…...

可训练对数线性稀疏注意力机制:原理与工程实践

1. 项目背景与核心价值在深度学习领域,注意力机制已经成为Transformer架构的核心组件。然而传统注意力机制的计算复杂度随着序列长度呈平方级增长,这严重限制了模型处理长序列的能力。我们团队开发的"可训练对数线性稀疏注意力机制"正是为了解…...

构建AI智能体长期记忆系统:向量检索与分层存储实战

1. 项目概述:一个为AI智能体打造的“记忆宫殿”如果你最近在折腾AI智能体,比如用Cursor、Claude或者GPT-4的API来构建一些自动化工作流,那你大概率会遇到一个头疼的问题:上下文遗忘。智能体就像一个记忆力只有几页纸的“金鱼”&am…...

别再乱用vector的insert和erase了!C++ STL迭代器失效的坑我帮你踩完了(附VS2022调试实录)

从崩溃现场到完美避坑:VS2022调试实战揭秘vector迭代器失效的真相 第一次在循环中调用v.erase(it)导致程序崩溃时,我盯着调试器里那个0xDDDDDDDD的地址值发呆了十分钟。作为从C转战C的开发者,这种内存错误似曾相识却又截然不同——它背后隐藏…...

告别VMWare!用VirtualBox 7.0.6给CentOS 7.6装个桌面,保姆级避坑指南

告别VMWare!用VirtualBox 7.0.6打造高效CentOS 7.6桌面环境全攻略 在开源工具日益成熟的今天,VirtualBox作为一款轻量级、跨平台的虚拟机解决方案,已经成为开发者搭建测试环境的首选。特别是对于需要频繁创建、销毁实验环境的Linux学习者而言…...

从小学数学竖式到FPGA硬件:图解4位乘法器是如何‘搭’出来的

从小学数学竖式到FPGA硬件:图解4位乘法器是如何‘搭’出来的 记得小学三年级第一次接触乘法竖式时,老师用粉笔在黑板上画出的那些错位相加的格子吗?当时我们或许不会想到,这些看似简单的计算步骤,竟与当今最先进的芯片…...

用AT32F437的QSPI给项目扩容:手把手实现W25N01G NAND Flash的文件系统移植(FatFs)

基于AT32F437的QSPI扩展存储实战:从NAND Flash驱动到FatFs文件系统全解析 在嵌入式系统开发中,存储扩展常常是提升产品竞争力的关键。AT32F437系列微控制器凭借其高性能QSPI接口,为开发者提供了连接大容量NAND Flash的便捷途径。本文将深入探…...

Arm Neoverse V3AE核心架构与电源管理技术解析

1. Arm Neoverse V3AE核心架构概述Arm Neoverse V3AE是基于Armv9.2-A架构设计的高性能处理器核心,主要面向数据中心和云计算工作负载优化。作为Arm Neoverse产品线的最新成员,V3AE在保持高性能计算能力的同时,通过创新的电源管理技术实现了显…...

LVGL界面布局避坑指南:为什么你的lv_obj_align_to总对不齐?

LVGL界面布局避坑指南:为什么你的lv_obj_align_to总对不齐? 在嵌入式GUI开发中,LVGL凭借其轻量级和跨平台特性成为许多开发者的首选。然而,当新手尝试构建复杂界面时,往往会遇到一个令人抓狂的问题——明明调用了对齐函…...

Python后端Flask如何实现短信验证码发送_调用云厂商API实现功能

...

Unity性能优化实战:用Magica Cloth的Virtual Deformer把高模裙子顶点数砍掉80%

Unity性能优化实战:Magica Cloth虚拟变形器实现高模裙子顶点数缩减80% 在角色表现力与性能消耗的天平上,技术美术常常需要做出艰难抉择。当项目中的女性角色穿着繁复的裙装时,传统布料模拟方案往往让移动设备GPU不堪重负。Magica Cloth的Virt…...