给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
注意目标值可能出现负数。
思想:常规思路,dfs递归遍历二叉树,维护一个存储当前走过结点的切片,以及当前的路径值,如果当前的路径值加上当前结点的值和目标相等且当前结点无左右子树,将路径切片存入结果中,否则继续遍历左右子树,由于可能出现负值,故不对值进行递增或递减的优化。
这里要注意一个坑,go中的append是浅拷贝,后续遍历会影响res中的值,需要使用copy来实现深拷贝。
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ var res [][]int func pathSum(root *TreeNode, target int) [][]int { if root==nil{ return nil } s:=0 var temp []int dfs(root,target,s,temp) var res1 = res res = res[0:0][0:0] return res1 } func dfs(root *TreeNode,target int,s int,temp []int){ if root.Val+s == target&&root.Left==nil&&root.Right==nil{ temp = append(temp,root.Val) var temp1 = make([]int,len(temp)) copy(temp1,temp) res = append(res,temp1) } if root.Left!=nil||root.Right!=nil{ temp = append(temp,root.Val) if root.Left!=nil{ dfs(root.Left,target,s+root.Val,temp) } if root.Right!=nil{ dfs(root.Right,target,s+root.Val,temp) } } return }
题目来源:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof