问题描述:

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

  1. root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
  2.  
  3. 10
  4. / \
  5. 5 -3
  6. / \ \
  7. 3 2 11
  8. / \ \
  9. 3 -2 1
  10.  
  11. 返回 3。和等于 8 的路径有:
  12.  
  13. 1. 5 -> 3
  14. 2. 5 -> 2 -> 1
  15. 3. -3 -> 11

方法1:

  1. class Solution(object):
  2. def pathSum(self, root, sum):
  3. """
  4. :type root: TreeNode
  5. :type sum: int
  6. :rtype: int
  7. """
  8. def dfs(root,sum):
  9. if root == None:
  10. return 0
  11. if root.val == sum:
  12. return 1 + dfs(root.left,0) + dfs(root.right,0)
  13. return dfs(root.left,sum - root.val) + dfs(root.right,sum - root.val)
  14. if root == None:
  15. return 0
  16. return dfs(root,sum) + self.pathSum(root.left,sum) + self.pathSum(root.right,sum)

方法2:

  1. class Solution(object):
  2. def pathSum(self, root, sum):
  3. """
  4. :type root: TreeNode
  5. :type sum: int
  6. :rtype: int
  7. """
  8. self.sum=sum
  9. self.result=0
  10. self.d={0:1}
  11. self.f(root,0)
  12. return(self.result)
  13.  
  14. def f(self,root,csum):
  15. if(root!=None):
  16. csum+=root.val
  17. if((csum-self.sum) in self.d):
  18. self.result+=self.d[csum-self.sum]
  19. if(csum in self.d):
  20. self.d[csum]+=1
  21. else:
  22. self.d[csum]=1
  23. self.f(root.left,csum)
  24. self.f(root.right,csum)
  25. self.d[csum]-=1

方法3:

  1. class Solution(object):
  2. def pathSum(self, root, target):
  3. """
  4. :type root: TreeNode
  5. :type target: int
  6. :rtype: int
  7. """
  8. self.count = 0
  9. preDict = {0: 1}
  10. def dfs(p, target, pathSum, preDict):
  11. if p:
  12. pathSum += p.val
  13. self.count += preDict.get(pathSum - target, 0)
  14. preDict[pathSum] = preDict.get(pathSum, 0) + 1
  15. dfs(p.left, target, pathSum, preDict)
  16. dfs(p.right, target, pathSum, preDict)
  17. preDict[pathSum] -= 1
  18. dfs(root, target, 0, preDict)
  19. return self.count

2018-10-02 20:04:13

LeetCode--437--路径总和3的更多相关文章

  1. Java实现 LeetCode 437 路径总和 III(三)

    437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点 ...

  2. Leetcode 437.路径总和III

    路径总和III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). ...

  3. [LeetCode] 437. 路径总和 III ☆☆☆(递归)

    路径总和 III 描述 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子 ...

  4. leetcode 437. 路径总和 III

    题目描述: 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). 二 ...

  5. 【LeetCode】437. 路径总和 III

    437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点 ...

  6. LeetCode 112. 路径总和(Path Sum) 10

    112. 路径总和 112. Path Sum 题目描述 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节 ...

  7. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

  8. LeetCode:路径总和【112】

    LeetCode:路径总和[112] 题目描述 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例 ...

  9. LeetCode 中级 - 路径总和2(113)

    给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 ...

  10. LeetCode 113. 路径总和 II(Path Sum II)

    题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / ...

随机推荐

  1. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*; public c ...

  2. Android灯光系统通知灯【转】

    本文转载自:https://blog.csdn.net/danwuxie/article/details/82193880 一.通知灯应用程序的编写 1.首先实现一个按钮功能 <LinearLa ...

  3. POJ - 2421 Constructing Roads 【最小生成树Kruscal】

    Constructing Roads Description There are N villages, which are numbered from 1 to N, and you should ...

  4. Win10子系统Ubuntu安装llvm+clang

    https://apt.llvm.org/ 首先 然后 再然后修改/etc/apt/sources.list,添加下面的东西 然后 参考: https://blog.kowalczyk.info/ar ...

  5. Tutorial on word2vector using GloVe and Word2Vec

    Tutorial on word2vector using GloVe and Word2Vec 2018-05-04 10:02:53 Some Important Reference Pages ...

  6. ISTQB学习笔记

    学习ISTQB大纲此文记录初次阅读时不够明确的地方 第一章:软件测试基础1. 引起软件缺陷的原因人都会犯错误(error,mistake),因此人设计的代码或文档中会引入缺陷(defect, faul ...

  7. CPU指令集设计RISC和CISC

    CPU指令集 硬件实现具有速度快,成本高,灵活性差,软件实现与之相反.因此出现频率高的基本功能首选硬件实现.指令集的不同反映了设计原理.制造技术和系统类别. RISC 精简指令集计算机(Reduced ...

  8. 8、nginx和tengine简介

    练习: 使用nginx反向代理(rr调度)用户请求至两个以上的后端LAMP(按标准路径部署的有pma,wd),不管用户请求是什么内容都反向代理至后端服务器去,但是如果用户请求的是图片或者是html,就 ...

  9. python学习 day014打卡 内置函数二&递归函数

    本节主要内容: 1.lambda匿名函数 2.sorted() 3.filter() 4.map() 5.递归函数 6.二分法 一.lambda匿名函数 为了解决一些简单的需求而设计的一句话函数 # ...

  10. Linux命令之sudo

    在 Linux  系统中,由于 root 的权限过大,一般情况下都不使用它.只有在一些特殊情况下才采用登录root 执行管理任务,一般情况下临时使用 root 权限多采用 su 和 sudo 命令. ...