113. 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
复杂度分析
时间复杂度:O(N^2),其中 N 是树的节点数。在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。此时,路径的数目为 O(N),并且每一条路径的节点个数也为 O(N),因此要将这些路径全部添加进答案中,时间复杂度为 O(N^2)
空间复杂度:O(N),其中 N 是树的节点数。空间复杂度主要取决于栈空间的开销,栈中的元素个数不会超过树的节点数。
//递归:通过一个 slice=tmp 记录中间路径结果var res [][]intfunc pathSum(root *TreeNode, sum int) [][]int {res = [][]int{}path := []int{}dfs(root, sum, path)return res}func dfs(root *TreeNode, sum int, path []int) {if root == nil {return}path = append(path, root.Val) //全局变量if root.Left == nil && root.Right == nil && root.Val == sum {tmp := make([]int, len(path)) //不影响的临时变量,需要拷贝的条件是同一个切片用于二维数组的多个下标copy(tmp, path) //拷贝,避免后面的路径把它污染,所以先把当前结果拷贝出来res = append(res, tmp)}dfs(root.Left, sum - root.Val, path)dfs(root.Right, sum - root.Val, path)}
