🥈Medium

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
给定如下二叉树,以及目标和 sum = 22,

  1. 5
  2. / \
  3. 4 8
  4. / / \
  5. 11 13 4
  6. / \ / \
  7. 7 2 5 1

返回:

  1. [
  2. [5,4,11,2],
  3. [5,8,4,5]
  4. ]


提示

节点总数 <= 10000

题解

今天字节面试原题,写的有问题,面试遇到了三个月前的面试官和原题,还是一团糟!今晚上得要好好复习,不能偷懒,明天面试一定要顺利!
image.png
谁能想到2021.1.11再一次面字节,又遇到这道题了呢!o(╥﹏╥)o。当时看明白之后也没有好好总结和复习。树方面还是很薄弱的

深度优先搜索

枚举每一条从根节点到叶节点的路径。当遍历到叶节点,且此时路径和恰好为目标和时,就是一条满足条件的路径。

Python

  1. def pathSum(root, total):
  2. res=[]
  3. path=[]
  4. def dfs(node,total):
  5. if not root:
  6. return
  7. path.append(root.val)
  8. total -= root.val
  9. if not root.left and not root.right and total == 0:
  10. # 这里要注意添加的是深拷贝,不是原数组
  11. res.append(path[:])
  12. dfs(root.left,total)
  13. dfs(root.right,total)
  14. path.pop()
  15. dfs(root,total)
  16. return res

JavaScript

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val) {
  4. * this.val = val;
  5. * this.left = this.right = null;
  6. * }
  7. */
  8. /**
  9. * @param {TreeNode} root
  10. * @param {number} sum
  11. * @return {number[][]}
  12. */
  13. var pathSum = function(root, sum) {
  14. let res=[]
  15. let path=[]
  16. let dfs=function (node,sum){
  17. if (!node){
  18. return
  19. }
  20. path.push(node.val)
  21. sum-=node.val
  22. if (!node.left && !node.right && sum===0){
  23. let temp=path
  24. res.push(JSON.parse(JSON.stringify(path)))
  25. }
  26. dfs(node.left,sum)
  27. dfs(node.right,sum)
  28. path.pop()
  29. }
  30. dfs(root,sum)
  31. return res
  32. };

复杂度分析

  • 时间复杂度:🥈34. 二叉树中和为某一值的路径(LeetCode 113)@ - 图2。其中 🥈34. 二叉树中和为某一值的路径(LeetCode 113)@ - 图3 是树的节点数。在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。此时,路径的数目为🥈34. 二叉树中和为某一值的路径(LeetCode 113)@ - 图4,并且每一条路径的节点个数也为🥈34. 二叉树中和为某一值的路径(LeetCode 113)@ - 图5,因此要将这些路径全部添加进答案中,时间复杂度为🥈34. 二叉树中和为某一值的路径(LeetCode 113)@ - 图6
  • 空间复杂度:🥈34. 二叉树中和为某一值的路径(LeetCode 113)@ - 图7,其中 N 是树的节点数。空间复杂度主要取决于栈空间的开销,栈中的元素个数不会超过树的节点数。

    广度优先搜索