算法日记day 18(二叉树的所有路径|左叶子之和)

一、二叉树的所有路径

题目:

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

 示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

思路:

采用前序遍历,递归和回溯法相辅相成, 用一个列表负责记录所走的路径,从根节点开始对每个节点依次遍历,直到遇到左右子节点均为空为止(即叶子节点),结束遍历,同时记录该条路径上所有的节点,并用"->"拼接

代码:

public void traversal(TreeNode root, List<Integer> paths, List<String> res) {paths.add(root.val); // 将当前节点的值添加到路径列表中// 如果当前节点是叶子节点,将路径列表转换为字符串并加入结果列表if (root.left == null && root.right == null) {StringBuilder sb = new StringBuilder();for (int i = 0; i < paths.size() - 1; i++) {sb.append(paths.get(i)).append("->");}sb.append(paths.get(paths.size() - 1));res.add(sb.toString());return;}// 递归处理左子树if (root.left != null) {traversal(root.left, paths, res);paths.remove(paths.size() - 1); // 回溯,移除左子树的路径节点}// 递归处理右子树if (root.right != null) {traversal(root.right, paths, res);paths.remove(paths.size() - 1); // 回溯,移除右子树的路径节点}
}
  • 功能:递归地遍历二叉树,并在叶子节点处将路径转换为字符串后存入结果列表。
  • 逻辑
    • 将当前节点的值 root.val 添加到路径列表 paths 中。
    • 如果当前节点是叶子节点(即左右子节点都为 null),将路径列表中的节点值按路径格式拼接为字符串,并添加到结果列表 res 中。
    • 递归处理左子树和右子树,同时在递归完成后进行回溯,即移除路径列表 paths 的最后一个节点,以便处理下一个分支的路径。
public List<String> binaryTreePaths(TreeNode root) {List<String> res = new ArrayList<>();List<Integer> paths = new ArrayList<>();if (root == null) {return res;}traversal(root, paths, res);return res;
}
  • 功能:初始化结果列表 res 和路径列表 paths,然后调用 traversal 方法进行遍历。
  • 逻辑
    • 如果 root 为 null,直接返回空的结果列表 res
    • 否则,调用 traversal 方法进行遍历,将结果存入 res 中。

二、左叶子之和

题目:

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1]
输出: 0

思路:

由于在遍历到叶子节点时并不清楚其是否为左叶子节点,因此在遍历时需要判断其父节点,如果其父节点有左子节点,且该左子节点是叶子节点,则将该左子节点的值加入最终结果,然后继续遍历下一个节点

代码:

//递归法
public int sumOfLeftLeaves(TreeNode root) {if (root == null) {return 0;}// 递归计算左子树中左叶子节点的和int leftNum = sumOfLeftLeaves(root.left);// 递归计算右子树中左叶子节点的和int rightNum = sumOfLeftLeaves(root.right);int count = 0;// 如果当前节点的左孩子存在,并且左孩子是叶子节点(即没有左右孩子)if (root.left != null && root.left.left == null && root.left.right == null) {count = root.left.val;  // 将左叶子节点的值加入到计数中}// 返回当前子树中左叶子节点值之和return leftNum + rightNum + count;
}
  1. 递归基础情况

    • 如果 root 为 null,即空节点,则直接返回 0,表示没有左叶子节点。
  2. 递归计算

    • leftNum 表示递归计算左子树中左叶子节点值之和。
    • rightNum 表示递归计算右子树中左叶子节点值之和。
  3. 判断左叶子节点

    • 在当前节点 root 的左孩子存在,并且左孩子的左右孩子都为 null,即左孩子是叶子节点。
    • 如果满足条件,将左孩子节点的值 root.left.val 加入到 count 中。
  4. 返回结果

    • 返回当前子树中所有左叶子节点的值之和,即 leftNum + rightNum + count
//迭代法
public int sumOfLeftLeaves(TreeNode root) {if (root == null) return 0;Stack<TreeNode> stack = new Stack<> ();stack.add(root);  // 将根节点压入栈int result = 0;while (!stack.isEmpty()) {TreeNode node = stack.pop();  // 弹出栈顶节点// 如果当前节点的左孩子存在,并且左孩子是叶子节点(即没有左右孩子)if (node.left != null && node.left.left == null && node.left.right == null) {result += node.left.val;  // 将左叶子节点的值加入到结果中}// 先压入右孩子,再压入左孩子,保证左孩子先被处理(因为栈是先入后出)if (node.right != null) {stack.add(node.right);}if (node.left != null) {stack.add(node.left);}}return result;
}
  1. 初始处理

    • 如果 root 为 null,直接返回 0
  2. 使用栈迭代

    • 创建一个 Stack<TreeNode> 类型的栈,并将根节点 root 压入栈中。
  3. 迭代过程

    • 在循环中,弹出栈顶的节点 node
    • 如果 node 的左孩子存在,并且是叶子节点(即左右孩子都为 null),则将左孩子节点的值加入到 result 中。
  4. 节点处理顺序

    • 因为栈是后进先出的数据结构,所以先将右孩子压入栈,再将左孩子压入栈,这样可以保证在处理时左孩子先被处理。
  5. 返回结果

    • 循环结束后,返回 result,即为二叉树中所有左叶子节点值之和。

今天的学习就到这里

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

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

相关文章

抖音矩阵管理系统解决方案:一站式服务

在当今社交媒体蓬勃发展的时代&#xff0c;抖音作为一款短视频平台&#xff0c;凭借其独特的魅力和庞大的用户群体&#xff0c;已成为众多企业、个人乃至网红达人展示自我、推广品牌的重要舞台。然而&#xff0c;随着抖音账号数量的不断增加&#xff0c;如何高效、专业地管理这…

系统编程--Linux下文件的“其他操作”函数

这里写目录标题 文件存储理论补充dentry、inode 文件其他操作stat函数作用函数原型代码&#xff08;以获取文件大小为例&#xff09;补充&#xff08;获取文件类型&#xff09; lstat函数作用函数原型代码补充&#xff08;获取文件权限&#xff09;总结 tipslink函数作用简介函…

前端页面:用户交互持续时间跟踪(duration)user-interaction-tracker

引言 在用户至上的时代&#xff0c;精准把握用户行为已成为产品优化的关键。本文将详细介绍 user-interaction-tracker 库&#xff0c;它提供了一种高效的解决方案&#xff0c;用于跟踪用户交互的持续时间&#xff0c;并提升项目埋点的效率。通过本文&#xff0c;你将了解到如…

使用水星Mecury人形机器人搭建VR遥操作控制平台!

VR遥操作机械臂是一种将虚拟现实技术与机械臂控制相结合的系统&#xff0c;使用户可以通过虚拟现实设备操控和交互实际的机械臂。这种技术可以应用于多个领域&#xff0c;包括远程操作、培训、危险环境中的工作等。 双臂人形机器人是一种模拟人体上半身结构&#xff0c;包括头部…

跨域浏览器解决前端跨域问题

1.问题背景 这是一种属于非主流的解决跨域的方案&#xff0c;但是也是可以正常使用而且比较简单的。如果需要使用主流的解决前端跨域方案&#xff0c;请参考这篇文章。 我这边其实是优先建议大家使用主流的跨域方案&#xff0c;如果主流的实在不行&#xff0c;那么就使用跨域…

多路复用IO、TCP并发模型

时分复用 CPU单核在同一时刻只能做一件事情&#xff0c;一种解决办法是对CPU进行时分复用(多个事件流将CPU切割成多个时间片&#xff0c;不同事件流的时间片交替进行)。在计算机系统中&#xff0c;我们用线程或者进程来表示一条执行流&#xff0c;通过不同的线程或进程在操作系…

通过POST请求往Elastic批量插入数据

文章目录 引言I 请求文档请求参数请求例子引言 调试工具:Apifox 需求: 向Elasticsearch中的’test_index’索引批量插入文档 情况认证: Basic Auth 在 Header 添加参数 Authorization,其值为在 Basic 之后拼接空格,以及经过 Base64 编码的 {{Username}}:{{Password}} 示…

H3CNE(STP)

8.1 二层环路与STP的介绍 8.1.1 二层环路 8.1.2 冲突域 8.1.3 二层环路带来的问题 8.1.4 STP的基本概念&#xff1a;桥ID 8.1.5 STP的基本概念&#xff1a;根桥 8.1.6 STP的基本概念&#xff1a;Cost 8.1.7 STP的基本概念&#xff1a;Port ID 8.1.8 STP的基本概念&#xff1a;…

Ubuntu22.04下 MySQL8创建并使用存储过程

在Ubuntu下的MySQL 8中创建并使用存储过程&#xff1a; 使用mysql命令登录到MySQL服务器&#xff0c;例如&#xff1a; mysql -u root -p输入root用户的密码。 选择你想要创建存储过程的数据库&#xff0c;例如&#xff1a; CREATE DATABASE mydb;USE mydb;CREATE TABLE us…

pikachu Fileinclusion(local)

随便选择一个都试试 发现url上数字会变 发现文件名确实是file1.php~file5.php 那么会不会还有别的burp抓包选中数字 设置6-100的爆破 strat attack 678异常还有个100也是 先改一下试试看 其他的会报错 但是通过这我们可以得到路径 先写一个 下一步 读取系统文件 windows系统肯定…

【unity 新手教程 001/100】安装与窗口布局介绍

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持&#xff01;&#x1f49c;&#x1f49c; Unity下载与安装 &#x1f449;点击跳转详细图文步骤&#xff1a;Unity Hub Unity 编辑器 窗口布局&#xff1a; Hierarchy: 层级窗口 | 默认 Sample Scene (main camera、direc…

矩阵分析——线性积分方程组的矩阵解法研究

矩阵分析——线性积分方程组的矩阵解法研究 前言线性积分方程组的矩阵解法研究 前言 “矩阵分析”是一门选修课&#xff0c;当时选这门课程的原因是想着图像处理就涉及到很多矩阵运算。但没想到的是这门课程吧虽然是选修&#xff0c;最后的结课要求是让我们写一篇“论文”&…

.dat 文件如何查看内容

第一种通过hexdump -C hexdump -C potk-00199D-0435-20000201.dat 命令查看 第二种 vscode &#xff0c;将文件拖到vscode 工作区,选中要显示的乱码&#xff0c;点击右上角HEX图标&#xff0c;如下面两张图示

UM980高精度RTK定位模块支持哪些通信接口?

注 产品参数信息请以和芯星通最新版官方手册为准。

python-NLP:1中文分词

文章目录 规则分词正向最大匹配法逆向最大匹配法双向最大匹配法 统计分词语言模型HMM模型 jieba分词分词关键词提取词性标注 规则分词 基于规则的分词是一种机械分词方法&#xff0c;主要是通过维护词典&#xff0c;在切分语句时&#xff0c;将语句的每个字符串与词表中的词进行…

Java代码基础算法练习-字符串分类统计-2024.07.24

任务描述&#xff1a; 输入一行字符&#xff08;字符串长度不超过255&#xff09;&#xff0c;分别统计出其中英文字母、数字、空格和其他 字符的个数。&#xff08;提示&#xff0c;空格ASCALL码值为32&#xff09; 解决思路&#xff1a; 输入一字符串&#xff0c;先判断是否…

对递归的一些理解。力扣206题:翻转链表

今天在刷力扣的时候&#xff0c;在写一道翻转链表的题目的过程中&#xff0c;在尝试使用递归解决该问题的时候&#xff0c;第一版代码却每次都返回的是null&#xff0c;这个错误让我尝试去debug了一下&#xff0c;最终找出了问题&#xff0c;并且让我对递归有了一些更深的理解&…

顶级电子合同平台推荐:2024年精选

本文将介绍以下10款工具&#xff1a;e签宝、法大大、上上签、金格签约、契约锁、DocuSign、Concord、PandaDoc、Agiloft、Evisort。 在当今数字化时代&#xff0c;选择一个合适的电子合同平台可能会让人感到困惑&#xff0c;如何判断哪个平台最适合企业的需求&#xff1f;电子合…

Java之数组应用-选择排序-插入排序

已经完全掌握了冒泡排序和二分查找的同学&#xff0c;可以自己尝试学习选择、插入排序。不要求今天全部掌握&#xff0c;最近2-3天掌握即可&#xff01; 1 选择排序 选择排序(Selection Sort)的原理有点类似插入排序&#xff0c;也分已排序区间和未排序区间。但是选择排序每次…

超低功耗ARM Cortex-M33 TZ MCU STM32WBA54、STM32WBA55:通过提升无线性能实现更出色的用户体验

摘要 STM32WBA54、STM32WBA55产品系列同时支持多种无线标准&#xff0c;包括Bluetooth低功耗 5.4&#xff08;已认证&#xff09;、Zigbee、Thread以及可用作Thread边界路由器的Matter。 该产品系列具有出色的灵活性和更强的安全性&#xff0c;可帮助开发人员应对不断变化的无…