剑指Offer34. 二叉树中和为某一值的路径Golang版
1. 问题描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 target = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
提示:
节点总数 <= 10000
2. 思路
本问题是典型的二叉树方案搜索问题,使用回溯法解决,其包含 先序遍历 + 路径记录 两部分。
3. 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func pathSum(root *TreeNode, target int) [][]int {
var path []int
var res [][]int
recur(root, target, path, &res)
return res
}
func recur(root *TreeNode, target int, path []int, res *[][]int) {
if root == nil {
return
}
path = append(path, root.Val)
target = target - root.Val
// 如果是叶子节点,且能满足路径和为target
if target == 0 && root.Left == nil && root.Right == nil {
//slice是一个指向底层的数组的指针结构体
//因为是先序遍历,如果 root.Right != nil ,path 切片底层的数组会被修改
//所以这里需要 copy path 到 tmp,再添加进 res path 底层数据修改带来的错误
tmp := make([]int,len(path))
copy(tmp, path)
*res = append(*res, tmp)
}
recur(root.Left, target, path, res)
recur(root.Right, target, path, res)
path = path[0:len(path)-1]
}