Leetcode Link: 112. 路径总和 - 力扣(LeetCode) (leetcode-cn.com)
题目
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
本题关键点,非常容易错!!!!不是不会,是不审题!!!
- 只是判断有没有
- 路径必须根节点到叶子节点
叶子节点 是指没有子节点的节点。

解法一
思路:自己的思路,不对。
本题的特殊之处在如果存在从根节点到叶节点的路径才返回 True,而不存在这种路径则返回False
那么会存在如下几个特殊情况
- 输入二叉树[1, 2],
targetSum=1, 此时根节点满足targetSum,但是它不是叶子节点,所以返回False - 输入二叉树只有根节点,此时根节点值等于targetSum,它既是根节点也是叶子节点,应该返回
True - 输入二叉树为空,返回
False
特殊情况1和2很关键,本题的需要特别注意是的判断是不是叶子节点,如果不判断是不是叶子节点,一定会出错!
题解:提交了多次都不对,下面的依然不对,不知道哪里有问题,改正了。
class Solution:
def hasPathSum(self, root, targetSum):
# 特殊情况1,输入为空
if not root:
return False
# 特殊情况2,只有一个节点
if not root.left and not root.right:
return root.val == targetSum
def recur(cur, tar):
if not cur:
return False
# 判断是不是叶子节点
if not cur.Left and not cur. Right:
# 他妈的,这里错了,一直写的是 tar==0,叶子节点要是满足路径,那么就需要等于tar,而不是0,操了。
return tar == cur.val
tar = tar - cur.val
left = recur(cur.left, tar)
right = recur(cur.right, tar)
return left or right
return recur(root, targetSum)
解法二
思路: 思路同上,网友答案。 各种情况融合到了一起
题解:
class Solution(object):
def hasPathSum(self, root, sum):
if not root:
return False
# 判断是不是叶子节点
if not root.left and not root.right:
return sum == root.val
# 更新目标值
sum = sum - root.val
left = self.hasPathSum(root.left,sum)
right = self.hasPathSum(root.right,sum)
return left or right解法三
思路:BFS,队列
(自己)开辟两个队列,一个保存当前节点,一个保存节点对应的目标值,注意判断叶子节点
题解:
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
'''BFS'''
if not root:
return False
q = collections.deque()
q.append(root)
# target队列,存储至当前节点的目标值
# 简单想,只含有1个节点,若 target == root.val时候,则返回True
# 因此q_tar存储的应该是“上一个”节点-target的值
q_tar = collections.deque()
q_tar.append(targetSum)
res = False
while(q):
cur_target = q_tar.popleft()
cur = q.popleft()
if not cur.left and not cur.right:
res = res or (cur_target == cur.val)
if cur.right:
q.append(cur.right)
q_tar.append(cur_target-cur.val)
if cur.left:
q.append(cur.left)
q_tar.append(cur_target-cur.val)
return res解法四
思路:栈
题解:暂略