LeetCode-112.路径总和
题目描述
给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false。
叶子节点 是指没有子节点的节点。
示例1
1 | 输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 |
示例2
1 | 输入:root = [1,2,3], targetSum = 5 |
示例3
1 | 输入:root = [], targetSum = 0 |
提示
- 树中节点的数目在范围
[0, 5000]内 -1000 <= Node.val <= 1000-1000 <= targetSum <= 1000
题解
递归法
将路径之和问题拆解为左子树或右子树是否有和为
目标值与当前节点值之差的路径1
2
3
4
5
6
7
8
9func hasPathSum(_ root: TreeNode?, _ targetSum: Int) -> Bool {
guard let root = root else {
return false
}
if root.left === nil && root.right === nil {
return root.val == targetSum
}
return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val)
}遍历法
将路径之和问题拆解为到达当前节点时路径上的和与左子树或右子树的和相加等于目标值的问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23func hasPathSum2(_ root: TreeNode?, _ targetSum: Int) -> Bool {
guard let root = root else {
return false
}
var nodeStack = [root]
var valStack = [root.val]
while !nodeStack.isEmpty {
let cur = nodeStack.popLast()! // 当前节点
let curSum = valStack.popLast()! // 到当前节点时路径上的和
if cur.left === nil && cur.right === nil && curSum == targetSum {
return true
}
if let left = cur.left {
nodeStack.append(left)
valStack.append(curSum + left.val)
}
if let right = cur.right {
nodeStack.append(right)
valStack.append(curSum + right.val)
}
}
return false
}