一、题目
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
返回 3。和等于 8 的路径有:
5 -> 3
5 -> 2 -> 1
-3 -> 11
二、解题思路
首先统计路径数肯定需要遍历整个二叉树,加上题目说的需要自顶向下。然后根据题目说的不一定非得从根节点开始,也就是说遍历的时候要注意每个结点都有当头的一次,然后统计满足和的路径。
因为和是已知量,所以用和减去遍历的数直到等于0,就说明找到了符合条件的路径(这种方法比累加遍历数更简单直接)。根据上面所说的这些,提取到两点(定义的两个函数):1、通过减法找到符合条件的路径并累加路径数 2、遍历所有的数
注意:因为是全部遍历,所以左右子树都要注意到,写进函数里。我一开始写的时候因为考虑到遍历,所以一直在想怎么用for去解决问题。但二叉树是给定的类,所以用for反而很难处理,以后记住不能什么问题一上来都用for解决,定义函数去递归调用也是很好的方法。而且我发现和二叉树有关的题(目前已经碰见五六道了)大家都是用的if去想办法解决,基本上没人用for,即使是需要遍历。这样的好处是时间复杂度会小很多,而且也很简单好理解,一定要学会别人的思考方式,运用到之后的题中去。
三、代码
是参考一位网友提供的解法写的,也是leetcode里我唯一能看懂的一种写法,其他的都是一行怪,对小白非常不友好。出处:https://leetcode-cn.com/problems/path-sum-iii/solution/zi-shang-er-xia-by-slime-3/
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def pathSum(self, root: TreeNode, sum: int) -> int:
self.account=0
def throughRoot(root,sum):
if root==None:return 0
sum-=root.val
if sum==0:
self.account+=1
throughRoot(root.left,sum)
throughRoot(root.right,sum)
def loop(root,sum):
if root==None:return 0
throughRoot(root,sum)
loop(root.left,sum)
loop(root.right,sum)
loop(root,sum)
return self.account