1. 题目

给定一个二叉树的根节点root ,和一个整数targetSum ,求该二叉树里节点值之和等于targetSum的 路径的数目

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

示例1:

  1. 输入:root = [10, 5, -3, 3, 2, nil, 11, 3, -2, nil, 1], targetSum = 8
  2. 输出:3

image.png

  • 路径之和等于8,共计3条
  1. class Solution {
  2. func pathSum(_ root: TreeNode?, _ sum: Int) -> Int {
  3. //空直接返回
  4. guard let root = root else {
  5. return 0
  6. }
  7. //定义一个函数,计算输入的路径里是否存在满足条件的路径
  8. //它的工作原理是将输入数组的最后一个元素(对应二叉树新遍历到的节点的值)依次和其它元素(对应二叉树已经探访过的节点)相加
  9. //如果和为指定值,则count+1.计算必须包含新探访到的节点的原因是为了避免求重
  10. func roots(in arr:[Int], equal sum:Int) -> Int {
  11. var count = 0
  12. var temp = arr[arr.count - 1]
  13. if temp == sum {
  14. count += 1
  15. }
  16. for element in arr.dropLast().reversed() {
  17. temp += element
  18. if temp == sum {
  19. count += 1
  20. }
  21. }
  22. return count
  23. }
  24. //初始化一个栈用来存储二叉树 当前指向的节点 和 已经探索过的节点的信息
  25. var stack:[(TreeNode,[Int])] = [(root, [root.val])]
  26. //定义返回值
  27. var result = 0
  28. //遍历二叉树,不断由根向叶探索所有节点。每探索到一个新节点,就把这个节点和该节点的值加入到元组中
  29. while let node = stack.last?.0, let valueSum = stack.last?.1 {
  30. stack.removeLast()
  31. //每探索到一个新节点都去探查下有没有包含这个节点的满足条件的路径
  32. result += roots(in: valueSum, equal: sum)
  33. if node.left != nil {
  34. stack.append((node.left!, valueSum + [node.left!.val]))
  35. }
  36. if node.right != nil {
  37. stack.append((node.right!, valueSum + [node.right!.val]))
  38. }
  39. }
  40. return result
  41. }
  42. }