声明:
今天是第97道题。给定一个二叉树,它的每个结点都存放着一个整数值,找出路径和等于给定数值的路径总数。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3 2 11 / \ \ 3 -2 1 返回 3。和等于 8 的路径有: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11
解法1。用递归的方法,不过这里用了2层嵌套递归,里层计算当前root节点向下的满足条件的路径条数并返回,外层计算从每个节点向下的满足要求的路径条数并返回,代码如下。
执行用时: 1184 ms, 在Path Sum III的Python提交中击败了25.46% 的用户
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
def traverse(root,sum):
if not root:
return 0
val = (root.val == sum)
val += self.traverse(root.left,sum-root.val)
val += self.traverse(root.right,sum-root.val)
return val
if not root:
return 0
res = traverse(root,sum)
res += self.pathSum(root.left,sum)
res += self.pathSum(root.right,sum)
return res
解法2。同样用递归的方法,我不是很懂。。。代码如下
执行用时: 48 ms, 在Path Sum III的Python提交中击败了98.64% 的用户
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def pathSum(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: int
"""
presum = {0:1} # 构建字典
self.res = 0
self.helper(root,sum,0,presum)
return self.res
def helper(self,root,sum,cursum,presum):
if not root:
return
cursum += root.val
self.res += presum.get(cursum-sum,0)
presum[cursum] = presum.get(cursum,0)+1
self.helper(root.left,sum,cursum,presum)
self.helper(root.right,sum,cursum,presum)
presum[cursum] = presum.get(cursum,0)-1
结尾
解法1:http://bookshadow.com/weblog/2016/10/23/leetcode-path-sum-iii/
解法2:LeetCode