112.路径总和

【LetMeFly】112.路径总和:BFS + 更改节点的值

力扣题目链接:https://leetcode.cn/problems/path-sum/

给你二叉树的根节点 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

方法一:BFS + 更改节点的值

我们只需要BFS遍历一遍每个节点

同时,在遍历子节点的时候,直接将父节点的值加到子节点上

如果遍历到了叶子节点,并且叶子节点的值等于目标值,就返回true

全部遍历结束后,就返回false

  • 时间复杂度$O(N)$,其中$N$是节点的个数,我们只需要遍历一遍每个节点即可
  • 空间复杂度$O(N)$,注意这种方法修改了节点的原本的值。若题目要求不得修改原本的值,则在BSF的时候可以将节点和累计和(如pair<TreeNode*, int>)入队。但是空间复杂度不变。

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
queue<TreeNode*> q;
if (root)
q.push(root);
while (q.size()) {
TreeNode* thisNode = q.front();
q.pop();
if (thisNode->val == targetSum && (!thisNode->left) && (!thisNode->right))
return true;
if (thisNode->left) {
thisNode->left->val += thisNode->val;
q.push(thisNode->left);
}
if (thisNode->right) {
thisNode->right->val += thisNode->val;
q.push(thisNode->right);
}
}
return false;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125718939


112.路径总和
https://blog.letmefly.xyz/2022/07/11/LeetCode 0112.路径总和/
作者
Tisfy
发布于
2022年7月11日
许可协议