力扣113. 路径总和 II(Java,DFS解法)

news2024/11/30 15:29:04

Problem: 113. 路径总和 II

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • 代码实现细节处
  • Code

题目描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

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

在这里插入图片描述
在这里插入图片描述

思路

题目要求找出所有从根节点到叶子节点的路径总和,这一点很容易让我们联想到使用DFS来求解本题。

先序遍历的顺序递归遍历二叉树,当遍历到二叉树的叶子节点时判断当前路径所有元素和是否等于题目所给的targetSum。

解题方法

1.定义成员变量List<List> result用于记录并返回最终的二维结果数组
2.编写深度优先函数,找出所有的符合条件的路径。

2.1.每次先将当前节点添加到当前的路劲当中,并判断当前节点是否为叶子节点;若为叶子节点再判断当前的路径上所有节点值之和是否等于给定的targetSum,若等于则将当前路径添加到最终的结果集合result,若当前节点为叶子节点但路径上所有节点值之和不等于targetSum则将当前用于记录路径的数组的最后一位去掉。
2.2.递归当前节点的左子树和右子树,在归的过程中由于要回溯到上一层节点,所以也要将当前用于记录路径的数组的最后一位去掉!!!

复杂度

时间复杂度:

O ( n 2 ) O(n^2) O(n2)

空间复杂度:

O ( n ) O(n) O(n)

代码实现细节处

1.若当前节点为叶子节点但路径上所有节点值之和不等于targetSum则将当前用于记录路径的数组的最后一位去掉;

image.png
image.png

2.在归的过程中由于要回溯到上一层节点,所以也要将当前用于记录路径的数组的最后一位去掉!!!

image.png
image.png

Code

/**
 * 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 List<List<Integer>> result;

    /**
     * @param root      树的根节点
     * @param targetSum 目标值
     * @return List<List < Integer>>
     */
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        depthFirstSearch(root, targetSum, new ArrayList<>(), 0);
        return result;
    }

   /**
     * 深度优先函数,找出所有的符合条件的路径
     *
     * @param root    树的根节点
     * @param sum     给定的targetSum
     * @param path    用于记录一路径的数组
     * @param pathSum 当前路径上的所有元素值之和
     */
    private void depthFirstSearch(TreeNode root, int sum, List<Integer> path, int pathSum) {
        //先将当前节点值添加到路径集合
        path.add(root.val);
        //已经递归到根节点
        if (root.left == null && root.right == null) {
            //当前路径值等于所给目标值
            if (pathSum + root.val == sum) {
                List<Integer> foundPath = new ArrayList<>();
                foundPath.addAll(path);
                result.add(foundPath);
            }
            //路径已经最大,需处理
            path.remove(path.size() - 1);
            return;
        }
        if (root.left != null) {
            depthFirstSearch(root.left, sum, path, pathSum + root.val);
        }
        if (root.right != null) {
            depthFirstSearch(root.right, sum, path, pathSum + root.val);
        }
        //回退过程中需要再次处理路径
        path.remove(path.size() - 1);
    }
}

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

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

相关文章

YOLOv5算法进阶改进(4)— 引入解耦合头部 | 助力提高检测准确率

前言:Hello大家好,我是小哥谈。解耦头是目标检测中的一种头部设计,用于从检测网络的特征图中提取目标位置和类别信息。具体来说,解耦头部将目标检测任务分解为两个子任务:分类和回归。分类任务用于预测目标的类别,回归任务用于预测目标的位置。这种设计可以提高目标检测的…

Google Docs系统设计

1 简介 谷歌文档是一种协作文档编辑服务。 协作文档编辑服务可以通过两种方式设计&#xff1a; 设计为C/S架构的集中式设施,为所有用户提供文档编辑服务使用点对点技术设计&#xff0c;以便在单个文档上协作 大多数商业解决方案侧重于客户端服务体系结构&#xff0c;以实现…

物联网AI 无线连接学习之蓝牙基础篇 协议概述

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 1 蓝牙协议总体架构 1.1 Application层 应用属性层&#xff0c;通过API函数与协议栈交互&#xff1b; 1.2 Host层 Host层&#xff0c;逻辑链路控制及自适应协议层、安全管理层、属性协议层、通用访问配置…

Stable Diffusion绘画系列【1】:炫酷机甲美女

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Linux系统编程 day05 进程控制

Linux系统编程 day05 进程控制 1. 进程相关概念2. 创建进程3. exec函数族4. 进程回收 1. 进程相关概念 程序就是编译好的二进制文件&#xff0c;在磁盘上&#xff0c;占用磁盘空间。程序是一个静态的概念。进程即使启动了的程序&#xff0c;进程会占用系统资源&#xff0c;如内…

win11任务栏居中/靠左设置路径

win11任务栏居中/靠左设置路径 设置-个性化-任务栏-任务栏对齐方式

Proteus仿真--基于字符液晶显示的频率计

本文介绍基于数码管的频率计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中80C51单片机作为主控&#xff0c;用字符液晶作为显示模块&#xff0c;按下按键K1后可进行频率测量并显示 仿真运行视频 Proteus仿真--基于字符液晶显示的频率计 附完…

只狼 资源分享

版本介绍 v1.06版|容量15GB|官方简体中文|支持键盘.鼠标.手柄|赠官方原声4首BGM|赠多项修改器|赠一周目全义手忍具强化通关存档|2020年01月15号更新 只狼中文设置&#xff1a; https://jingyan.baidu.com/article/cb5d6105bc8556005d2fe048.html 只狼键盘对应按键&#xff1…

6.1 Windows驱动开发:内核枚举SSDT表基址

SSDT表&#xff08;System Service Descriptor Table&#xff09;是Windows操作系统内核中的关键组成部分&#xff0c;负责存储系统服务调用的相关信息。具体而言&#xff0c;SSDT表包含了系统调用的函数地址以及其他与系统服务相关的信息。每个系统调用对应SSDT表中的一个表项…

RocketMQ相关概念与使用入门详解

文章目录 RocketMQ 相关概念消息模型MQ 的简单消息模型RocketMQ 的复杂消息模型 RocketMQ 中消息相关概念消息&#xff08;Message&#xff09;主题&#xff08;Topic&#xff09;Tags队列消息标识 RocketMQ 中的物理对象NameServerBrokerProducerConsumer NameServer 与 Broke…

ARM推出Cortex-M85的小弟Cortex-M52, 集低功耗,低成本和单片机AI于一身

Cortex-M52特色&#xff1a; 1、基于ARMv8.1-M架构的内核已经有M55和M85. 新出的M52是采用Arm Helium 技术的最小处理器&#xff0c;可提供出色的低功耗&#xff0c;为物联网提供低成本和高性能AI技术。 2、Cortex-M52 专为需要提高数字信号处理和机器学习性能的 AIoT 应用而…

王者荣耀Java

代码 package com.sxt;import javax.swing.*; import java.awt.*;public class Background extends GameObject {public Background(GameFrame gameFrame) {super(gameFrame);// TODO Auto-generated constructor stub}Image bg Toolkit.getDefaultToolkit().getImage("…

《C++PrimePlus》第10章 对象和类

10.1 过程性编程和面向对象编程 10.2 抽象和类 10.3 类的构造函数和析构函数 类的定义和使用&#xff08;买卖股票&#xff09; 头文件stock10.h #ifndef __STOCK00__H__ #define __STOCK00__H__#include <string>class Stock { // pravate的内容只能通过public访问 p…

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

坚鹏:广州银行清华大学消费金融发展趋势与创新培训圆满结束

广州银行自1996年9月成立以来&#xff0c;依托中国经济腾飞的大好形势&#xff0c;成为国内具有一定知名度与地方特色的商业银行。截至2022年12月末&#xff0c;已开业机构174家&#xff0c;包括总行1家&#xff0c;分行级机构15家(含信用卡中心)、支行152家、信用卡分中心6家&…

STM32 外部中断配置与中断函数设计

单片机学习 目录 文章目录 一、外部中断配置步骤 1.1配置RCC 1.2配置GPIO 1.3配置AFIO 1.4配置EXTI 1.5配置NVIC 二、中断函数设计 总结 一、外部中断配置步骤 第一步&#xff1a;配置RCC&#xff0c;把涉及外设的时钟打开。第二步&#xff1a;配置GPIO&#xff0c;选择…

企业如何创建和运营在线知识库?

随着企业业务的不断扩展和复杂化&#xff0c;建立一个在线知识库已经成为企业提高效率、减少重复劳动和提升服务质量的重要手段。接下来就详细介绍一下企业如何创建和运营在线知识库。 | 一、明确知识库的需求和目标 在开始建立在线知识库之前&#xff0c;企业需要明确知识库的…

ClickHouse中的物化视图

技术主题 技术原理 物化视图&#xff08;Materialized View&#xff09;是一种预先计算并缓存结果的视图&#xff0c;存储在磁盘上自动更新&#xff0c;空间换时间的思路。物化视图是一种优化技术&#xff0c;本质上就是为了加速查询操作&#xff0c;降低系统负载&#xff0c…

操作系统——解决了我的一些困惑

目录 1、电脑开机做了什么事情 2、真正实现并行的计算机 3、计算机中的淘汰算法 & 分配算法 & 调度算法 & 空间管理 4、什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f;最多可分配多少&#xff1f; 5、TLB&#xff08;快表&#xff09;、分页存储&…

React入门使用 (官方文档向 Part1)

文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名&#xff01;高级提示&#xff1a;使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…