输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:[
[5,4,11,2],
[5,8,4,5]
]提示:
节点总数 <= 10000
思路:递归遍历,保存满足条件的路径。
遇到的坑:slice是一个指向底层的数组的指针结构体,使用append()函数的时候,没有真正的拷贝,仅仅是地址索引,因为必须开空间讲数据copy()过去
func pathSum(root *TreeNode, sum int) [][]int {
tarNum := make([][]int, 0)
pathSumHelper(root, sum, []int{}, &tarNum)
return tarNum
}
func pathSumHelper(root *TreeNode, sum int, path []int, result *[][]int) {
if root == nil {
return
}
path = append(path, root.Val)
sum -= root.Val
if sum == 0 && root.Left == nil && root.Right == nil {
/*
* slice是一个指向底层的数组的指针结构体
* 因为是先序遍历,如果 root.Right != nil ,arr 切片底层的数组会被修改
* 所以这里需要 copy arr 到 tmp,再添加进 ret,防止 arr 底层数据修改带来的错误
*/
// *result = append(*result, path)
tmp := make([]int, len(path))
copy(tmp, path)
*result = append(*result, tmp)
}
pathSumHelper(root.Left, sum, path, result)
pathSumHelper(root.Right, sum, path, result)
}