【每日算法】LeetCode 112 —— 路径总和(二百零四)

题目内容

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

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

示例

示例 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

示例 3:

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

提示

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

题解

本题采用递归的思想求解。有如下具体思考:

假设u为递归的每颗子树的根,a和b为左右儿子,f(u)代表从根到u这个点的路径和,那么f(a) = f(u) + a -> val ; f(b) = f(u) + b -> val 。

在实现上,我们可以通过更新每次迭代后的sum目标值,去判断当u为叶子节点后,更新的sum是否等于0来求出答案。

具体看代码即可。

代码

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
//当根节点为空时,返回false
if(!root) return false;
//更新sum,进行下次迭代
sum -= root->val;
//判断是否是叶子节点,且sum是否为0
if(!root->left && !root->right) return !sum;
//返回左儿子的递归结果 || 右儿子的递归结果
return (root->left && hasPathSum(root->left,sum)) ||(root->right && hasPathSum(root->right,sum));
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/07/29/【每日算法】LeetCode-112-——-路径总和(二百零四)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号