package main
import . "nc_tools"
/*
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param target int整型
* @return int整型二维数组
*/
func FindPath( root *TreeNode , target int ) [][]int {
// write code here
// 最终的结果切片
ans := [][]int{}
// 存放路径
path := []int{}
// 深度优先遍历
var dfs func(*TreeNode, int)
dfs = func(node *TreeNode, target int) {
// 遍历到叶子结点直接返回
if node == nil {
return
}
// 处理当前节点
target -= node.Val
path = append(path, node.Val)
// 如果添加了该节点后满足题目要求(路径必须以叶子节点结尾)
if node.Left == nil && node.Right == nil && target == 0 {
// path 地址是不变的,不能将 path 直接添加给 ans,否则所有结果中的路径最后都是一样的
temp := make([]int, len(path))
copy(temp, path)
ans = append(ans, temp)
}
// 继续处理左右孩子,即使是叶子节点也要走完这个流程,成功将节点弹出 path
dfs(node.Left, target)
dfs(node.Right, target)
// 回溯
path = path[:len(path)-1]
}
dfs(root, target)
return ans
}
