Leetcode:112. 路径总和、113. 路径总和 II(C++)

news2025/1/22 17:50:00

目录

112. 路径总和:

问题描述:

实现代码与解析:

递归:

原理思路:

迭代:

原理思路:

113. 路径总和 II:

问题描述:

实现代码与解析:

迭代:

原理思路:


112. 路径总和:

问题描述:

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

实现代码与解析:

递归:

class Solution {
public:
    bool traversal(TreeNode* cur,int count)
    {
        if(cur==NULL) return false;
        count-=cur->val;//减去当前结点的值
        //走到了叶子结点
        if(cur->left==NULL&&cur->right==NULL)
        {
            //若到这里count减为0,返回true,反之返回false
            if(count==0) return true;
            else return false;
        }
        bool left=traversal(cur->left,count);
        bool right=traversal(cur->right,count);
        return left||right;

    }
    bool hasPathSum(TreeNode* root, int targetSum) 
    {
        bool result=traversal(root,targetSum);
        return result;
    }
};

精简版:

class solution {
public:
    bool hasPathSum(TreeNode* root, int targetSum) 
    {
        if (root == null) return false;
        if (!root->left && !root->right && targetSum == root->val) 
        {
            return true;
        }
        return haspathsum(root->left, targetSum - root->val) || haspathsum(root->right, targetSum - root->val);
    }
};

原理思路:

        这里我们不用一个个累加然后判断是否与sum相等,可以让count等于targetSum然后每到一个结点就减去该结点的值,判断count最后是否为0,就可以知道该路径符不符合要求了,然后注意每个判断条件返回的是false还是true我们返回的时候用的是 || 而不是我们常用的 && ,因为这里我们只要有一条路线符合条件就可以了。然后代码其实就是在遍历代码上添加一点上述的条件而已,就不详细解释了,大家看代码就能看懂。

迭代:

class Solution {
public:
    
    bool hasPathSum(TreeNode* root, int targetSum) 
    {
        if(root==NULL) return false;
        stack<pair<TreeNode*,int>> st;//放入<结点,路径值>
        st.push(pair<TreeNode*,int>(root,root->val));
        while(!st.empty())
        {
            pair<TreeNode*,int> temp=st.top();
            st.pop();
            //若为叶子结点,进行判断
            if(!temp.first->left&&!temp.first->right&&targetSum==temp.second) return true;
            if(temp.first->right)
            {
                st.push(pair<TreeNode*,int>(temp.first->right,temp.second+temp.first->right->val));
            }
            if(temp.first->left)
            {
                st.push(pair<TreeNode*,int>(temp.first->left,temp.second+temp.first->left->val));
            }
        }
        return false;
    }
};

原理思路:

        这里我们用pair<TreeNode*,int>的结构来入栈,记录结点指针和当前结点与根结点的路径长,然后到叶结点判断其路径长是否与目标targetSum相等即可。

113. 路径总和 II:

问题描述:

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

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

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

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

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

实现代码与解析:

迭代:

class Solution {
public:
    vector<vector<int>> result;//记录结果
    vector<int> path;   //记录路径
    void traversal(TreeNode* cur,int count)
    {
        if(cur->left==NULL&&cur->right==NULL)
        {
            //符合条件
            if(count==0)
            {
                result.push_back(path);
                return;
            }
            //不符合条件直接返回
            else
            {
                return;
            }            
        }
        //左不为空
        if(cur->left)
        {
            path.push_back(cur->left->val);
            traversal(cur->left,count-cur->left->val);//减去下一结点值,传入
            path.pop_back();
        }
        //右不为空
        if(cur->right)
        {
            path.push_back(cur->right->val);
            traversal(cur->right,count-cur->right->val);//减去下一结点值,传入
            path.pop_back();
        }
        return;
    }
    
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) 
    {
        if (root == NULL) return result;
        path.push_back(root->val);//先把头结点放入路径
        traversal(root,targetSum-root->val);
        return result;
    }
};

原理思路:

        与上一题原理相同,就是这里我们要求全部符合要求的路径,所以这里我们另外定义一个path来记录,递归时不用返回值。
 

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

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

相关文章

分享66个NET源码,总有一款适合您

NET源码 分享66个NET源码&#xff0c;总有一款适合您 NET源码下载链接&#xff1a;https://pan.baidu.com/s/1-H0UV3yly3p1PXbeLAvMtA?pwdk06f 提取码&#xff1a;k06f page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "http…

go defer return panic 执行顺序

根据代码实例运行结果来总结说明&#xff1a;定义一个函数&#xff0c;有多个defer &#xff08;用于判断多个defer执行顺序&#xff09;&#xff0c;有panic和 return &#xff08;判断与defer对比执行顺序&#xff09;一、函数中有panicpackage mainimport "fmt"fu…

【矩阵论】8. 常用矩阵总结——秩1矩阵,优阵(单位正交阵),Hermite阵

矩阵论 1. 准备知识——复数域上矩阵,Hermite变换) 1.准备知识——复数域上的内积域正交阵 1.准备知识——Hermite阵&#xff0c;二次型&#xff0c;矩阵合同&#xff0c;正定阵&#xff0c;幂0阵&#xff0c;幂等阵&#xff0c;矩阵的秩 2. 矩阵分解——SVD准备知识——奇异值…

【性能调优】【离线任务】flink处理离线任务(8000个小文件?200多亿数据量?)稳定性与性能调优探索

文章目录一、场景描述1. 任务类型描述2. 问题任务二、相关理论1.Task Slots and Resources1.1. slots与资源的隔离和共享1.2 建议cpu和slot数关系2. tm的资源配置是否合适2.1. flink load problems2.2. 阿里 flink资源配置建议三、问题分析与解决1. 测试结果比对1.1. 任务11.2.…

小程序学习(2)-----常用的各类组件

新建项目 项目->新建项目-小程序&#xff0c;如下图所示 新建小程序页面 只需要在 app.json->pages 中新增页面的存放路径&#xff0c;小程序开发者工具可帮我们自动创建对应的页面文件&#xff0c;如图所示&#xff1a; 2.常用的视图容器类组件 ① view 普通视图区域类…

Java基础算法每日5道详解(3)

136. Single Number 单号 Given a non-empty array of integers nums, every element appears twice except for one. Find that single one. You must implement a solution with a linear runtime complexity and use only constant extra space. 给定一个非空整数数组 nu…

在Multisim导入TI提供的SPICE模型

对在multisim中导入TI模型的一个记录。 multisim中只有常规的元器件&#xff0c;对于很多元器件multisim都没有相应的模型&#xff0c;这就需要手动导入了。 Multisim导入模型1、从官网下载相应的模型文件2、在Multisim中导入模型3、写在后面1、从官网下载相应的模型文件 &…

c/c++ 函数(一) setw()、isdigit()、isalpha()、atoi()、itoa()

目录 1、setw(int n) <iomanip> 2、int isdigit(char ch) <ctype.h> 3、int isalpha(int c) <ctype.h> 4、int atoi(const char* str) <stdlib.h> 5、char* itoa(int num) <stdlib.h> 1、se…

Linux 基本权限

目录 1 shell命令以及运行原理 1.1 理解 1.2 意义 2 Linux权限的概念 2.1 概念 2.2 用户分类 2.3 Linux文件属性 2.4 Linux文件权限 2.4.1 文件访问者的分类&#xff08;人&#xff09; 2.4.2 root&&普通用户 vs 拥有者&&所属组&&other 2.4…

异步架构,避免相互依赖的系统耦合

前言&#xff1a; 使用缓存架构可以减少不必要的计算&#xff0c;快速响应用户请求&#xff0c;但是缓存只能改善系统的读操作性能&#xff0c;也就是在读取数据的时候&#xff0c;可以不从数据源中读取&#xff0c;而是通过缓存读取&#xff0c;以加速数据的读取速度。 但是…

vulnhub DC系列 DC-6

总结:wpscan爆破&#xff0c;nmap提权 下载地址 DC-6.zip (Size: 619 MB)Download: http://www.five86.com/downloads/DC-6.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-6.zip使用方法:解压后&#xff0c;使用vm直接打开ova文件。 漏洞分析 信息收集 这里还是使…

4. 数据处理:用R语言实现【多路替换】真高效!!

b站课程视频链接&#xff1a; https://www.bilibili.com/video/BV19x411X7C6?p1 腾讯课堂(最新&#xff0c;但是要花钱&#xff0c;我花99&#x1f622;&#x1f622;元买了&#xff0c;感觉讲的没问题&#xff0c;就是知识点结构有点乱&#xff09;&#xff1a;https://ke.qq…

Linux中的vim最小集、指令集及其配置

目录 1. vim 最小集 2 vim指令集 2.1 命令模式的指令 2.1.1 插入模式 2.1.2 移动光标 2.1.3 删除文字 2.1.4 复制 2.1.5 替换 2.1.6 撤销 2.1.7 更改 2.1.8 跳至指定的行 2.1.9 shift ~:快速大小写切换 2.2 末行模式的指令 2.2.1 set nu/set nonu 2.2.2 vs file…

【自学Python】Python变量

Python变量 Python变量教程 不论是使用哪种高级程序语言编写程序&#xff0c;变量都是其程序的基本组成单位。变量相当于内存中一个数据存储空间的表示&#xff0c;通过变量名可以访问到变量的具体的值。 Python变量 Python 是弱类型语言&#xff0c;因此 Python 变量无须声…

Hudi的核心概念 —— 时间轴(TimeLine)

文章目录时间轴&#xff08;TimeLine&#xff09;时间轴&#xff08;TimeLine&#xff09; 就是一个时间线&#xff0c;它的每一个操作都记录在内&#xff0c;每一个时刻&#xff0c;你做了什么事情&#xff0c;对某一个时刻&#xff0c;记录一个时刻的数据 Hudi 的核心是维护…

擎创运维大数据治理解决方案,荣膺金融业数字化转型突出贡献奖

近日&#xff0c;由《金融电子化》杂志社主办的“2022中国金融科技年会暨第十三届金融科技应用创新奖颁奖典礼”成功于线上举办。擎创科技“运维大数据治理解决方案”&#xff0c;荣膺“2022科技赋能金融业数字化转型突出贡献奖”。人民银行《金融科技发展规划&#xff08;2022…

C++ string类

在c语言中&#xff0c;我们想要记录字符串需要创建一个字符串的数组&#xff0c;而c则提供了另一种方式&#xff1b; 也就是这篇博客所说的string类&#xff1b; string类 #include<string> 作为字符串数组的升级版&#xff0c;string类自然也有它的独特之处——可变长数…

自动驾驶标定基础知识

目录基础概念1. 缩略语2. 为什么需要外参标定3. 基于使用场景的标定分类4. 基于方法的分类5. 基础坐标系6. 超差EOL标定1.EOL特点2. EOL标定流程3. EOL标定软件约束4. EOL标定软件流程5. 算法设计原则6. 算法基本原理背景式标定1.背景式标定的特点2. 背景式标定运行流程3. 背景…

高级树结构之线索化二叉树

文章目录一 线索化二叉树简介二 线索化规则三 前序线索化3.1 代码演示四 中序线索化4.1 代码演示五 后序线索化5.1 代码演示一 线索化二叉树简介 线索化&#xff1a;将一颗二叉树的结点指向为空的指针&#xff0c;线索化为某一种顺序遍历的的指向下一个按顺序的结点的指针一颗…

虚拟主机3种方式nginx/apache+跨域知识点整理

目录referer、prototype、array、json笔记整理: [http://t.csdn.cn/s4P8x](http://t.csdn.cn/s4P8x)虚拟主机3种方式nginx/apache跨域知识点整理一、Apache基于多IP、多端口、多域名访问1、添加网卡三种方法1、虚拟机添加网络适配器2、命令添加3、用nmtui 添加ip地址2、添加配置…