剑指offer——JZ82 二叉树中和为某一值的路径(一) 解题思路与具体代码【C++】

2023-10-07 19:52

本文主要是介绍剑指offer——JZ82 二叉树中和为某一值的路径(一) 解题思路与具体代码【C++】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述与要求

二叉树中和为某一值的路径(一)_牛客题霸_牛客网 (nowcoder.com)

题目描述

给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。

1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点

2.叶子节点是指没有子节点的节点

3.路径只能从父节点到子节点,不能从子节点到父节点

4.总节点数目为n
例如:
给出如下的二叉树,sum=22,

返回true,因为存在一条路径 5→4→11→2的节点值之和为 22

数据范围:

1.树上的节点数满足 0≤n≤10000

2.每 个节点的值都满足 ∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度O(n)

进阶:空间复杂度 O(树的高度),时间复杂度 O(n)

示例

示例1:

输入:{5,4,8,1,11,#,9,#,#,2,7},22

返回值:true

示例2:

输入:{1,2},0

返回值:false

示例3:

输入:{1,2},3

返回值:true

示例4:

输入:{},0

返回值:false


二、解题思路

根据题目描述,我们需要判断这个二叉树是否存在父节点到叶子结点的路径的和等于sum,很明显我们需要对这个二叉树进行遍历,且路径定义为从树的根结点开始往下一直到叶子结点所经过的结点。因而我们需要从根结点开始逐层往下寻找,并且判断是否存在路径能够使它们的和等于sum。

比起我们去定义一个变量来计算路径之和与sum比较,这样经常需要更新,容易搞混,所以我们不如直接在访问完每个结点需要进入到下一层的时候,直接将sum减去当前结点的值,这样一直到叶子结点,只要此时sum减去叶子结点的值等于0,那么就说明路径存在,即可返回true即可。

我们可以采用递归的思想,依次访问每个结点,当然首先要判断结点是否为空,空则直接返回false,然后判断当前结点是否是叶子结点,是的话则判断sum-当前结点的值是否等于0,都满足的话代表路径存在,返回true,不满足的话就继续访问当前结点的左右子节点继续进行判断,一直到遍历完整棵树,最后返回结果即可。


三、具体代码

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param root TreeNode类 * @param sum int整型 * @return bool布尔型*/bool hasPathSum(TreeNode* root, int sum) {//空结点找不到路径if(root==nullptr)  return false;//当访问到叶子节点并且sum此时为0 则代表找到了路径if(root->left==nullptr&&root->right==nullptr&&sum-root->val==0)return true;//递归访问子节点 同时将sum-当前结点的值return hasPathSum(root->left,sum-root->val)||hasPathSum(root->right, sum-root->val);}
};

这篇关于剑指offer——JZ82 二叉树中和为某一值的路径(一) 解题思路与具体代码【C++】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160081

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: