题目描述: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。
今日学习: 1.树、递归
题解: 1.本题题解: 递归:root是null就返回false,然后sum -= root.val,判断root是否为叶子节点&&sum == 0,是就返回true,不是就继续计算左右子树(left||right)
var hasPathSum = function(root, sum) {
if(!root) return false
// let target = sum
// target -= root.val
sum -= root.val
if(sum == 0 && !root.left && !root.right) {
return true
}else {
return hasPathSum(root.left, sum) || hasPathSum(root.right, sum)
}
};
var hasPathSum = function(root, sum) {
if(!root) return false
sum -= root.val
if(!root.left && !root.right) {
return sum == 0
}else {
return hasPathSum(root.left, sum) || hasPathSum(root.right, sum)
}
}
2.进阶题解: 找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 递归:每次都把当前节点存入path,如果满足(叶子+sum),就将path添加进pathes结果数组中,否则继续计算左右子树,最后返回pathes
var pathSum = function(root, sum) {
let pathes = []
if(!root) return pathes
Path(root, sum, pathes, [])
return pathes
};
var Path = function(root, sum, pathes, path) {
if(!root) {return;}
path = path.concat(root.val)
sum -= root.val
if(sum == 0 && !root.left && !root.right) {
pathes.push(path)
}else {
Path(root.left, sum, pathes, path)
Path(root.right, sum, pathes, path)
}
}