[Day33-01]-[二叉树] 路径总和
作者:方勇(gopher)
- 2022 年 5 月 02 日
本文字数:1237 字
阅读完需:约 4 分钟
113. 路径总和 II
难度中等 737 收藏分享切换为英文接收动态反馈
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
复制代码
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:[]
复制代码
示例 3:
输入:root = [1,2], targetSum = 0
输出:[]
复制代码
题解:
注意 Golang 中,切片复制,按值或引用复制的区别。
func TestPathSum(t *testing.T) {
var root = &TreeNode{
Val: 5,
Left: &TreeNode{
Val: 4,
Left: &TreeNode{
Val: 11,
Left: &TreeNode{
Val: 7,
},
Right: &TreeNode{
Val: 2,
},
},
},
Right: &TreeNode{
Val: 8,
Left: &TreeNode{
Val: 13,
},
Right: &TreeNode{
Val: 4,
Left: &TreeNode{
Val: 5,
},
Right: &TreeNode{
Val: 1,
},
},
},
}
var targetSum = 22
var routes = [][]int{}
var path = []int{}
var dfs func(root *TreeNode, sum int) // DLR 遍历
dfs = func(root *TreeNode, sum int) {
if root == nil { // 递归终止条件
return
}
path = append(path, root.Val) // 将值放入到路径中
defer func() { // 每次回溯结束的时候哦回到上个位置
path = path[:len(path)-1]
}()
sum += root.Val // 累加值
if root.Left == nil && root.Right == nil && sum == targetSum { // 到达叶子节点的时候处理逻辑
// routes = append(routes, path) 这种写法是错误的是,这种复制是按引用复制,path如果修改会影响route
routes = append(routes, append([]int{}, path...)) // 按值复制 或者 copy 深度复制
}
dfs(root.Left, sum)
dfs(root.Right, sum)
}
dfs(root, 0)
t.Log(routes)
}
复制代码
题解二: 更容易想到
func TestPathSum(t *testing.T) {
var root = &TreeNode{
Val: 5,
Left: &TreeNode{
Val: 4,
Left: &TreeNode{
Val: 11,
Left: &TreeNode{
Val: 7,
},
Right: &TreeNode{
Val: 2,
},
},
},
Right: &TreeNode{
Val: 8,
Left: &TreeNode{
Val: 13,
},
Right: &TreeNode{
Val: 4,
Left: &TreeNode{
Val: 5,
},
Right: &TreeNode{
Val: 1,
},
},
},
}
var routes = [][]int{}
var targetSum = 22
var dfs func(root *TreeNode, path []int, sum int)
dfs = func(root *TreeNode, path []int, sum int) {
if root == nil {
return
}
path = append(path, root.Val)
sum += root.Val
if root.Left == nil && root.Right == nil {
if sum == targetSum {
tmp := make([]int, len(path))
copy(tmp, path)
routes = append(routes, tmp)
}
}
dfs(root.Left, path, sum)
dfs(root.Right, path, sum)
}
dfs(root, []int{}, 0)
t.Log(routes)
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 6
方勇(gopher)
关注
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
评论