剑指 Offer 34. 二叉树中和为某一值的路径(golang版)

  • 题目描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。
从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

示例:
给定如下二叉树,以及目标和 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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值