给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和sum。
说明: 叶子节点是指没有子节点的节点。
思路:
深度优先搜索,每次递归sum -= 根节点的值,当到达叶子节点时,判断sum == 叶子节点值。
方法一
使用栈,每次记录当前节点和sum-当前节点值,
如果当前节点没有左子树和右子树,且sum-节点值==0,则找到路径,
否则,依次记录左子树和右子树
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
stack = [(root,sum-root.val)]
while stack :
r,sum = stack.pop()
if r.left:
stack.append((r.left,sum-r.left.val))
if r.right:
stack.append((r.right,sum-r.right.val))
if not r.left and not r.right and sum ==0:
return True
return False
方法二
递归的思想
递归终止条件:到达叶节点
单次递归: sum - 节点值
返回值: 左子树或右子树存在路径
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
sum -= root.val
if not root.left and not root.right and sum == 0:
return True
return self.hasPathSum(root.left,sum) or self.hasPathSum(root.right,sum)