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