路径总和

题目描述:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

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

示例 1:
img
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:
img
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 –> 2): 和为 3
(1 –> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

dfs

每层计算都进行targetSum-root.val 如果到叶子节点时 targetSum===root.val说明路径和符合要求了

1
2
3
4
5
6
7
8
9
10
11
var hasPathSum = function(root, targetSum) {
if(!root) {
return false
}
// 搜到叶子节点,则判断当前节点值是否等于目标值
if(!root.left && !root.right) {
return root.val === targetSum
}
// 还没搜到叶子节点,则进行 目标值-当前节点值,并继续往下搜
return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val)
};

复杂度分析

  • 时间复杂度:O(N)
  • 空间复杂度:O(H)

bfs

使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和

当遍历到叶子节点,判断路径和即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var hasPathSum = function(root, targetSum) {
if(!root) {
return false
}
// BFS法 创建两个数组 一个记录所有节点 一个记录路径和
const queue = []
const res = []
queue.push(root)
res.push(root.val)
while(queue.length) {
const node = queue.shift()
const temp = res.shift()
// 如果遍历到叶子节点处时 路径和=targetSum 则返回true
if(!node.left && !node.right) {
if(temp === targetSum) return true
}
// 如层序遍历一般更新queue与路径和数组
if(node.left) {
queue.push(node.left)
res.push(temp + node.left.val)
}
if(node.right) {
queue.push(node.right)
res.push(temp + node.right.val)
}
}
return false
};

复杂度分析

  • 时间复杂度:O(N)

  • 空间复杂度:O(N)