首页 > 其他分享 >代码随想录第18天 | 513.找左下角的值 112.路径总和

代码随想录第18天 | 513.找左下角的值 112.路径总和

时间:2024-03-25 23:02:59浏览次数:20  
标签:right 18 随想录 targetSum 左下角 null root 节点 left

513.找左下角的值

513. 找树左下角的值 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili

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

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

示例 1:

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

示例 2:

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

提示:

  • 二叉树的节点个数的范围是 [1,104]
  • -231 <= Node.val <= 231 - 1

第一反应是找二叉树最深的路径,然后返回最深路径的最左边的节点。

如何找到最左边的节点呢?可以前序遍历,保证左边优先搜索,然后记录深度最大的叶子节点,此时就是树的最后一行的最左边的值。

递归三部曲:

1、确定递归函数的参数和返回值:

参数是传入的根节点,返回值是节点数,为int类型

class Solution{
    public int findBottomLeftValue(TreeNode root){
        
    }     

}

2、确定终止条件:

遇到叶子节点的时候,就需要统计一下最大深度,所以需要遇到叶子节点来更新最大深度

if(root == null) return;
if(root.left == null && root.right == null){
    
}

3、确定单层递归的逻辑:

如果当前节点的左孩子不为空,则遍历到左孩子,深度加1;如果当前节点的右孩子不为空,则遍历到右孩子,深度加1

if (root.left != null) findLeftValue(root.left, deep + 1);
// 递归查找右子树的最左边节点,深度加 1
if (root.right != null) findLeftValue(root.right, deep + 1);

综合代码:

// 递归法
class Solution {
    // 记录当前最深层级
    private int Deep = -1;
    // 存储最底层最左边节点的值
    private int value = 0;
    
    // 公有方法,用来找到最底层最左边的节点的值
    public int findBottomLeftValue(TreeNode root) {
        // 将根节点的值赋给 value
        value = root.val;
        // 调用私有方法开始递归查找最左边的节点,并传入初始深度为 0
        findLeftValue(root, 0);
        // 返回最底层最左边节点的值
        return value;
    }

    // 递归方法,用于查找最左边的节点
    private void findLeftValue(TreeNode root, int deep) {
        // 如果当前节点为空,直接返回
        if (root == null) return;
        // 如果当前节点是叶子节点
        if (root.left == null && root.right == null) {
            // 如果当前深度大于之前记录的最深层级
            if (deep > Deep) {
                // 更新最底层最左边节点的值和最深层级
                value = root.val;
                Deep = deep;
            }
        }
        // 递归查找左子树的最左边节点,深度加 1
        if (root.left != null) findLeftValue(root.left, deep + 1);
        // 递归查找右子树的最左边节点,深度加 1
        if (root.right != null) findLeftValue(root.right, deep + 1);
    }
}

112.路径总和

112. 路径总和 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

拿不准的遍历顺序,搞不清的回溯过程,我太难了! | LeetCode:112. 路径总和_哔哩哔哩_bilibili

给你二叉树的根节点 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
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

  • 树中节点的数目在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

第一反应是遍历这棵二叉树,然后把一条路径的值相加,等于目标整数则返回true,不符合则返回false

递归三部曲:

1、确定参数和返回值。参数是根节点,返回值为boolean类型。

class Solution{
    public boolean hasPathSum(TreeNode root, int targetSum){
        if(root == null){
        return false;
        }
    }

}

2、确定终止条件:可以让计数器count 初始为目标值targetSum,遍历路径的过程中逐步相减,如果最后count = 0,同时遍历到了叶子节点,则return true;如果遍历到了叶子节点,count不为0,则return false

targetSum -= root.val;
// 如果当前节点是叶子节点
if (root.left == null && root.right == null) {
// 判断目标和是否为 0,若为 0 则返回 true,否则返回 false
return targetSum == 0;

3、确定单层递归的逻辑:

 if (root.left != null) {
 // 递归调用 hasPathSum 函数,传入左子节点和更新后的目标和
     boolean left = hasPathSum(root.left, targetSum);
 // 如果左子树存在满足条件的路径,直接返回 true
 if (left) {      // 已经找到
     return true;
     }
 }
 // 如果当前节点有右子节点
 if (root.right != null) {
 // 递归调用 hasPathSum 函数,传入右子节点和更新后的目标和
 boolean right = hasPathSum(root.right, targetSum);
 // 如果右子树存在满足条件的路径,直接返回 true
 if (right) {     // 已经找到
     return true;
     }
 }

综合代码:

```java
class Solution {
    // 判断是否存在从根节点到叶子节点的路径,使得路径上节点值之和等于目标和
    public boolean hasPathSum(TreeNode root, int targetSum) {
        // 如果根节点为空,直接返回 false
        if (root == null) {
            return false;
        }
        // 减去当前节点的值,更新目标和
        targetSum -= root.val;
        // 如果当前节点是叶子节点
        if (root.left == null && root.right == null) {
            // 判断目标和是否为 0,若为 0 则返回 true,否则返回 false
            return targetSum == 0;
        }
        // 如果当前节点有左子节点
        if (root.left != null) {
            // 递归调用 hasPathSum 函数,传入左子节点和更新后的目标和
            boolean left = hasPathSum(root.left, targetSum);
            // 如果左子树存在满足条件的路径,直接返回 true
            if (left) {      // 已经找到
                return true;
            }
        }
        // 如果当前节点有右子节点
        if (root.right != null) {
            // 递归调用 hasPathSum 函数,传入右子节点和更新后的目标和
            boolean right = hasPathSum(root.right, targetSum);
            // 如果右子树存在满足条件的路径,直接返回 true
            if (right) {     // 已经找到
                return true;
            }
        }
        // 若左右子树均不存在满足条件的路径,返回 false
        return false;
    }
}
```

标签:right,18,随想录,targetSum,左下角,null,root,节点,left
From: https://blog.csdn.net/lilith_2001/article/details/136975221

相关文章

  • 基于LabVIEW上位机与Arduino单片机串口通信的DS18B20环境温度采集
    基于LabVIEW上位机与Arduino单片机串口通信的DS18B20环境温度采集Arduino代码#include<OneWire.h>#include<DallasTemperature.h>#defineONE_WIRE_BUS2//DS18B20接至Arduino数字口2OneWireoneWire(ONE_WIRE_BUS);DallasTemperaturesensors(&oneWire);byteco......
  • MySQL索引18连问,谁能顶住
    前言过完这个节,就要进入金银季,准备了18道MySQL索引题,一定用得上。作者:感谢每一个支持:github1.索引是什么索引是一种数据结构,用来帮助提升查询和检索数据速度。可以理解为一本书的目录,帮助定位数据位置。索引是一个文件,它要占用物理空间。2.MySQL索引有哪些......
  • AGC018C Coins 题解
    模拟费用流。传送门题意:共\(n=x+y+z\)个人,每个人可以选择获得\(a_i\)个金币或\(b_i\)个银币或\(c_i\)个铜币。要选\(x\)个人拿金币,\(y\)个人拿银币,\(z\)个人拿铜币。问币数总和最大是多少。\(n\le10^5\)。先建出费用流模型:把一个人的选择视作一个人流到了金币/......
  • 代码随想录第六天: 哈希表(数组+HashSet+HashMap)
    语言:Java参考资料:代码随想录、ChatGPT3.5当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个......
  • 并查集(反集)进阶 P1892 [BOI2003] 团伙
    现在有 n 个人,他们之间有两种关系:朋友和敌人。我们知道:一个人的朋友的朋友是朋友一个人的敌人的敌人是朋友现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。输入格式第一行输入一个整数 n 代表人数。第二行......
  • 代码随想录第四天 链表Part02
    语言:Java参考资料:代码随想录、ChatGPT3.524.两两交换链表中的节点力扣题目链接(opensnewwindow)给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路这道题目正常模拟就可以了。建议......
  • 代码随想录第一天-双指针+二分法
    参考资源:https://programmercarl.com/、ChatGPT3.5语言:Java二分法二分法,又称为二分查找或折半查找,是一种在有序数组中查找目标值的算法。它的基本思想是将目标值与数组中间的元素进行比较,若目标值等于中间元素,则查找成功;若目标值小于中间元素,则在数组的左半部分继续查......
  • 云计算 3月18号 (mysql安装及操作)
    一、Mysql1.1MySQL数据库介绍1.1.1什么是数据库DB?DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作;1.1.2什么是sql?SQL代表结构化查询语言(StructuredQ......
  • 卡码java基础课 | 18.洗盘子
    学习内容:栈的基本概念(空栈、栈顶、栈底)和特点(先入后出)入栈、出栈、获取栈顶元素和判断栈是否为空栈等基本操作Stack类的使用重点归纳:栈:后进先出,LIFO,lastinfirstout。使用方法:importjava.util.Stack。常用方法:isEmpty():判断栈是否为空栈,如果为空栈返回true,否则或者f......
  • 代码随想录 Day3 数组 | LC977 有序数组的平方 & LC209 长度最小的子数组(滑动窗口))
    四、有序数组的平方题目:力扣977:有序数组的平方给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100]排序后,数组变为[......