//golang解法

package main

import "fmt"

/**
 * Created by Chris on 2021/8/3.
 */

type TreeNode struct{
	Val int
	Left *TreeNode
	Right *TreeNode
}

func pathSum(root *TreeNode,  sum int) [][]int {
	if root == nil{
		return [][]int{}
	}
	//存放结果
	var res [][]int
	//暂存当前路径
	var temp []int
	//深度优先搜索
	dfs(sum, &res, temp, root)
	return res
}

func dfs(sum int, res *[][]int, temp []int, node *TreeNode){
	//遇到空节点
	if node == nil{
		return
	}
	//记录路径:添加当前节点
	temp = append(temp, node.Val)
	sum -= node.Val
	//遇到叶子节点
	if node.Left == nil && node.Right == nil && sum == 0{
		//创建新的切片,用于保存当前路径。
		//不可以直接使用:*res = append(*res, temp),这是引用了temp中的数据,没有复制temp中的数据。
		tempRes := append([]int(nil), temp...)
		*res = append(*res, tempRes)
	}
	//递归
	dfs(sum, res, temp, node.Left)
	dfs(sum, res, temp, node.Right)
	//去除节点
	temp = temp[:len(temp) - 1]
}

func main() {
	var node1 = &TreeNode{5, nil, nil}
	var node2 = &TreeNode{4, nil, nil}
	var node3 = &TreeNode{8, nil, nil}
	var node4 = &TreeNode{1, nil, nil}
	var node5 = &TreeNode{11, nil, nil}
	var node6 = &TreeNode{9, nil, nil}
	var node7 = &TreeNode{2, nil, nil}
	var node8 = &TreeNode{7, nil, nil}

	node1.Left = node2
	node1.Right = node3
	node2.Left = node4
	node2.Right = node5
	node3.Right = node6
	node5.Left = node7
	node5.Right = node8

	var sum int = 22
	var res [][]int = pathSum(node1, sum)
	fmt.Println(res)
}