算法日记day 19(找树左下角的值|路径总和)

news2024/11/23 13:33:48

一、找树左下角的值

题目:

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1

示例 2:

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

思路:

该题的意思是要找到最深层的且最左端的节点,并不是找左节点, 因此容易理解错误。首先需要寻找其深度最大的叶子节点,可以采用递归的方式分别遍历其左右子树,最后输出其最深且最左端的叶子节点的值

代码:

int Deep = -1; // 全局变量,用于记录最大深度
int value = 0; // 全局变量,用于记录最底层最左边节点的值

// 主方法,返回二叉树最底层最左边节点的值
public int findBottomLeftValue(TreeNode root) {
    value = root.val; // 初始化value为根节点的值
    findLeft(root, 0); // 调用递归方法,从根节点开始查找最左边节点
    return value; // 返回最底层最左边节点的值
}

// 递归方法,查找最底层最左边的节点
public void findLeft(TreeNode root, int deep) {
    if (root == null)
        return; // 如果当前节点为空,直接返回

    // 如果当前节点是叶子节点,并且深度大于记录的最大深度Deep
    if (root.left == null && root.right == null) {
        if (deep > Deep) {
            value = root.val; // 更新最底层最左边节点的值为当前节点的值
            Deep = deep; // 更新最大深度为当前深度
        }
    }

    // 递归处理左子树
    if (root.left != null) {
        deep++; // 深度加1
        findLeft(root.left, deep); // 递归调用,处理左子树
        deep--; // 递归结束后,深度减1,回溯到当前层
    }

    // 递归处理右子树
    if (root.right != null) {
        deep++; // 深度加1
        findLeft(root.right, deep); // 递归调用,处理右子树
        deep--; // 递归结束后,深度减1,回溯到当前层
    }
}
  1. 全局变量定义

    • Deep 和 value 都是全局变量,Deep 初始值为 -1value 初始值为 0
  2. findBottomLeftValue 方法

    • 这是主方法,用于找到最底层最左边节点的值。
    • 首先将根节点的值赋给 value
    • 然后调用 findLeft 方法,传入根节点和初始的深度 0
  3. findLeft 方法

    • 这个方法是递归地查找最底层最左边的节点。
    • 如果当前节点 root 为 null,直接返回。
    • 如果当前节点是叶子节点(即左右孩子都为 null),则判断当前深度 deep 是否大于 Deep,如果是,则更新 value 为当前叶子节点的值,并更新 Deep 为当前深度 deep
  4. 递归左右子树

    • 如果当前节点有左子树,递归调用 findLeft 方法,深度 deep 加一。
    • 如果当前节点有右子树,同样递归调用 findLeft 方法,深度 deep 加一。
    • 每次递归结束后,深度 deep 需要减一,以保证递归回溯时深度正确。
  5. 返回结果

    • 最终 value 中存储的是最底层最左边节点的值,该值由 findLeft 方法更新。

二、路径总和 

题目:

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

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

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

思路:

初始化一个计数变量count=0,从根节点开始,每遍历一个节点让目标值减去这个节点值,最后看是否存在一个减到与count值相等的路径,有返回true,否则返回false

代码:

public boolean hasPathSum(TreeNode root, int targetSum) {
    // 如果根节点为空,直接返回 false
    if (root == null)
        return false;
    
    // 减去当前节点的值,更新目标和
    targetSum = targetSum - root.val;
    
    // 如果当前节点是叶子节点,检查目标和是否为 0
    if (root.left == null && root.right == null) {
        return targetSum == 0;
    }
    
    // 递归检查左子树是否存在满足条件的路径
    if (root.left != null) {
        boolean left = hasPathSum(root.left, targetSum);
        // 如果左子树存在满足条件的路径,直接返回 true
        if (left)
            return true;
    }
    
    // 递归检查右子树是否存在满足条件的路径
    if (root.right != null) {
        boolean right = hasPathSum(root.right, targetSum);
        // 如果右子树存在满足条件的路径,直接返回 true
        if (right)
            return true;
    }
    
    // 如果左右子树都不存在满足条件的路径,返回 false
    return false;
}

今天的学习就到这里 

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

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

相关文章

【多线程】定时器

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 定时器是什么?2. 定时器的应用场景3. Timer类的使用3.1 Timer类创建定时器3.2 schedule()方法…

Unity横板动作游戏 -项目准备

项目准备 这是一篇 Unity 2022 最新稳定版本的教程同步笔记,本文将会讲解一些开始学习必须的条件。 安装环境 首先是安装 UnityHub,然后在 UnityHub 中安装 Unity 的版本(2022)。 只需要安装 开发者工具 和文档即可,导出到其他平台的工具等…

学习Vue2收藏这一篇就够了(如何创建Vue实例)

什么是Vue? Vue是什么:是一个用于构建用户界面的渐进式框架 什么是构建用户界面:基于数据动态渲染页面 什么是渐进式:循序渐进的学习 什么是框架:一整套完整的项目解决方案 创建Vue实例 核心步骤(4步…

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式,设计模式就好比是一种固定代码套路类似于棋谱,是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是,在有…

音视频入门基础:WAV专题(3)——FFmpeg源码中,判断某文件是否为WAV音频文件的实现

一、引言 通过FFmpeg命令: ./ffmpeg -i XXX.wav 可以判断出某个文件是否为WAV格式的音频文件: 所以FFmpeg是怎样判断出某个文件是否为WAV格式的音频文件呢?它内部其实是通过wav_probe函数来判断的。从文章《FFmpeg源码:av_prob…

02、爬虫数据解析-Re解析

数据解析的目的是不拿到页面的全部内容,只拿到部分我们想要的内容内容。 Re解析就是正则解析,效率高准确性高。学习本节内容前需要学会基础的正则表达式。 一、正则匹配规则 1、常用元字符 . 匹配除换行符以外的字符 \w 匹配字母或数字或下划…

软件测试---网络基础、HTTP

一、网络基础 (1)Web和网络知识 网络基础TCP/IP 使用HTTP协议访问Web WWW万维网的诞生 WWW万维网的构成 (2)IP协议 (3)可靠传输的TCP和三次握手策略 (4)域名解析服务DNS &#xff0…

一篇文章学完Python基础

1. 字符串 str1 "Hello" str2 " World" print(str1 str2) # 输出:HelloWorld 1.1 字符替换 text "Hello, World!" new_text text.replace("World", "Python") print(new_text) # 输出:…

大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

橙单前端项目下载编译遇到的问题与解决

今天下载orange-admin前端项目,不过下载下来运行也出现一些问题。 1、运行出现下面一堆错误,如下: 2、对于下面这个错误 error Expected linebreaks to be LF but found CRLF linebreak-style 这就是eslint的报错了,可能是原作者…

全开源收银系统源码-支付通道

1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网站: HTML5vue2.0element-uicssjs线下收银台(安卓/PC收银、安卓自助收银): Dart3框架:Flutter 3.19.6助手: uniapp商城: uniapp 2.支付通道 智慧新零售收银系统…

SQL语句(以MySQL为例)——单表、多表查询

笛卡尔积(或交叉连接): 笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中…

天机学堂第二天项目 添加我的课表 项目总结

目录 根据产品原型得到数据库表结构 RabbitMq监听 构造器注入 幂等 mybatisplus 分页查询的多种写法 在new page里面添加排序 查询条件中 用orderBydESC指定排序 ​编辑 链式编程中使用page指定排序 stream流 ​编辑 在网关中解析token 根据产品原型得到数据库表结构 根…

IDEA Maven使用HTTP代理,解决Could not transfer artifact org.xxx问题

文章目录 一、前言二、遇到问题三、分析问题四、HTTP代理五、重新编译验证 一、前言 遇到这个问题,有两种解决办法 IDEA Maven使用HTTP代理,解决Could not transfer artifact org.xxx问题IDEA Maven使用国内镜像,解决Could not transfer arti…

Matlab编程资源库(10)离散傅立叶变换

一、离散傅立叶变换算法简要 给定一个N点的离散信号序列x(n),其中n表示时刻,n 0, 1, 2, ..., N-1。 定义离散傅立叶变换的频域序列X(k),其中k表示频率,k 0, 1, 2, ..., N-1。 通过以下公式计算每个频率对应的复数值&#xff…

win11 备份mysql数据 卸载mysql 5 安装mysql 8详细教程(mysql的数据备份与卸载与安装)

如果是第一次安装mysql便可以直接看第三步 第一步:数据备份 我选择的是备份全部数据 以管理员身份运行cmd输入mysqldump -u root -p --all-databases --routines --triggers --single-transaction > C:\ProgramTools\MySql\backup_5.6.sql 其中:-u…

golang 文件

golang 文件 概念 文件是计算机系统中用于存储和管理的 数据集合,具有唯一的名称,存在于存储介质上,包含创建、修改等属性,通过文件系统进行组织,用户可进行读取、写入等操作 文件流 文件输入流(InputS…

3D打印:重塑模具制造业的创新引擎

在科技浪潮的推动下,3D打印技术正以前所未有的速度渗透到制造业的核心,尤其在模具制造领域,它正引领一场深刻的创新革命。该技术通过颠覆传统制造范式,显著优化了模具生产的复杂流程,实现了从设计到成品的一体化的高效…

Git操作快速入门:掌握代码版本控制的秘诀

文章目录 文章内容概述Git的安装和配置创建和克隆仓库基本操作添加和提交文件查看状态和日志分支管理远程仓库操作 常见的错误和解决方法错误1:合并冲突(Merge Conflict)错误2:丢失修改(Detached HEAD)错误…

win11查找句柄泄露

1.打开任务管理器,不会的网上搜 2.选择详细信息 3.注意了 比较坑的一点 win11上详细信息不会默认显示句柄数。(默认没有句柄那一列,妈的花了我好长时间找) 右键,点击选择列 选择句柄 下面的列表里就能看到进程使用…