113. 路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

复杂度分析

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

  1. //递归:通过一个 slice=tmp 记录中间路径结果
  2. var res [][]int
  3. func pathSum(root *TreeNode, sum int) [][]int {
  4. res = [][]int{}
  5. path := []int{}
  6. dfs(root, sum, path)
  7. return res
  8. }
  9. func dfs(root *TreeNode, sum int, path []int) {
  10. if root == nil {
  11. return
  12. }
  13. path = append(path, root.Val) //全局变量
  14. if root.Left == nil && root.Right == nil && root.Val == sum {
  15. tmp := make([]int, len(path)) //不影响的临时变量,需要拷贝的条件是同一个切片用于二维数组的多个下标
  16. copy(tmp, path) //拷贝,避免后面的路径把它污染,所以先把当前结果拷贝出来
  17. res = append(res, tmp)
  18. }
  19. dfs(root.Left, sum - root.Val, path)
  20. dfs(root.Right, sum - root.Val, path)
  21. }