- 题目描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。
从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 target = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
节点总数 <= 10000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-
思路
1、先序遍历,tmpSlice保存走过的路径
2、sum = 目标值 - 当前路径之和
3、若节点值等于sum切其为根节点,符合要求,保存路径并返回
4,注意切片的底层数组有可能被修改,会影响到最后的返回结果,所以需要copy一份 -
代码
func pathSum(root *TreeNode, target int) [][]int {
if root == nil {
return nil
}
var res [][]int
dfs(root, target, []int{}, &res)
return res
}
func dfs(root *TreeNode,sum int, tmpSlice []int, res *[][]int){
//空节点返回
if root == nil {
return
}
//sum是差值,若节点的值==sum切为叶子节点,说明该路径符合要求,处理返回
if root.Val == sum && root.Right == nil && root.Left == nil {
//将本节点追加到路径尾
tmpSlice = append(tmpSlice,root.Val)
//将该路径复制到一个临时切片中,这是为了防止当root.Right不为空时tmpSlice切片的底层数组会被修改
tmp := make([]int,len(tmpSlice))
copy(tmp, tmpSlice)
//将路径追加到res切片中
*res = append(*res, tmp)
return
}
tmpSlice = append(tmpSlice,root.Val)
//处理左子树
dfs(root.Left, sum-root.Val, tmpSlice, res)
//处理右子树
dfs(root.Right, sum-root.Val, tmpSlice, res)
}
- 测试代码
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func pathSum(root *TreeNode, target int) [][]int {
if root == nil {
return nil
}
var res [][]int
dfs(root, target, []int{}, &res)
return res
}
func dfs(root *TreeNode,sum int, tmpSlice []int, res *[][]int){
//空节点返回
if root == nil {
return
}
//sum是差值,若节点的值==sum切为叶子节点,说明该路径符合要求,处理返回
if root.Val == sum && root.Right == nil && root.Left == nil {
//将本节点追加到路径尾
tmpSlice = append(tmpSlice,root.Val)
//将该路径复制到一个临时切片中,这是为了防止当root.Right不为空时tmpSlice切片的底层数组会被修改
tmp := make([]int,len(tmpSlice))
copy(tmp, tmpSlice)
//将路径追加到res切片中
*res = append(*res, tmp)
return
}
tmpSlice = append(tmpSlice,root.Val)
//处理左子树
dfs(root.Left, sum-root.Val, tmpSlice, res)
//处理右子树
dfs(root.Right, sum-root.Val, tmpSlice, res)
}
func main(){
var root = TreeNode{5,nil,nil}
root.Left = &TreeNode{4,nil,nil}
root.Right = &TreeNode{8,nil,nil}
root.Left.Left = &TreeNode{11,nil,nil}
root.Right.Left = &TreeNode{13,nil,nil}
root.Right.Right = &TreeNode{4,nil,nil}
root.Left.Left.Left = &TreeNode{7,nil,nil}
root.Left.Left.Right = &TreeNode{2,nil,nil}
root.Right.Right.Left = &TreeNode{5,nil,nil}
root.Right.Right.Right = &TreeNode{1,nil,nil}
res := pathSum(&root,22)
fmt.Println(res)
}