「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。
题目
链接:leetcode-cn.com/problems/pa…
给你二叉树的根节点 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
思路
本题就是在二叉树遍历每个节点的同时还要留心一下路径和的问题,其实就是DFS BFS很简单的应用,不要把题目想复杂~
只要掌握了DFS BFS的思想 是可以轻松解题的!
- BFS迭代
本题中 BFS的思路比较容易想到
维护一个队列记录当前节点,并根据当前节点搜索下一层
维护一个队列记录路径和temp,并时刻更新(将下一层的节点值计算进去,并时刻判断是否为叶子节点,如果是叶子节点则将temp与targetSum进行比较)
唔,这跟层序遍历的代码就很像好吧~
var hasPathSum = function(root, targetSum) {
if(!root) {
return false
}
// BFS法 创建两个数组 一个记录所有节点 一个记录路径和
const queue = []
const res = []
queue.push(root)
res.push(root.val)
// 进入BFS
while(queue.length) {
const top = queue.pop()
const temp = res.pop()
// 如果遍历到叶子节点处时 路径和=targetSum 则返回true
if(top.left === null && top.right === null) {
if(temp === targetSum) return true
}
// 如层序遍历一般更新queue与路径和数组
if(top.left) {
queue.push(top.left)
res.push(temp + top.left.val)
}
if(top.right) {
queue.push(top.right)
res.push(temp + top.right.val)
}
}
return false
};
- DFS
与广度优先使用计算路径和的思路反了过来
深搜使用的思想是,每层计算都进行targetSum-root.val 如果到叶子节点时 targetSum===root.val说明路径和符合要求了
var hasPathSum = function(root, targetSum) {
if(root === null) {
return false
}
// 搜到叶子节点,则判断当前节点值是否等于目标值
if(root.left === null && root.right === null) {
return root.val === targetSum
}
// 还没搜到叶子节点,则进行 目标值-当前节点值,并继续往下搜
return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val)
};