112. Path Sum (Easy)

二叉树问题。求是否存在和目标值一致的路径和。

路径和指的是从根节点到叶子节点的路径的值相加的结果。

看上去这道题适合 DFS 一条路径一条路径的遍历解决。

思路 1,递归,前序遍历

一层一层求和直到叶子节点,判断是否和目标一致。

class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False

def dfs(node, curr):
curr += node.val
if not node.left and not node.right:
return curr == targetSum
if node.left and dfs(node.left, curr):
return True
if node.right and dfs(node.right, curr):
return True
return False

return dfs(root, 0)

思路 2,另一种前序遍历写法

相同思路,另一种写法。这次我们用解题函数自身作为 DFS 函数,也不再进行求和判断,相反我们每次遍历从目标值中减去遇到的值。

这两种方法没有本质区别。

class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False

if not root.left and not root.right and root.val == targetSum:
return True
if self.hasPathSum(root.left, targetSum - root.val):
return True
if self.hasPathSum(root.right, targetSum - root.val):
return True

return False

思路 3,迭代

有递归的地方就有 Stack,来试试用迭代的方式实现这个过程。

迭代的方式注意点在于我们需要同时保存节点和累积值。

这个思路的逻辑看上去要更简洁。

class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False

stack = [(root, root.val)]
while stack:
node, val = stack.pop()
if not node.left and not node.right and val == targetSum:
return True
if node.left:
stack.append((node.left, node.left.val + val))
if node.right:
stack.append((node.right, node.right.val + val))

return False