题面
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例: 给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回
[
[5,4,11,2],
[5,8,4,5]
]
实现
- 复用后序遍历逻辑
- 栈进进出,先进后出,边进边出,出进进
type Stack struct{
Node *TreeNode
Sum int
Path []int
}
func pathSum(root *TreeNode, sum int) [][]int {
if root == nil {
return nil
}
rs := [][]int{}
st :=[]Stack{Stack{Node:root},}
for len(st) > 0 {
top := st[len(st)-1]
st = st[:len(st)-1]
if top.Node.Left == nil && top.Node.Right == nil && top.Sum + top.Node.Val == sum {
cp := make([]int,len(top.Path)+1)
copy(cp, top.Path)
cp[len(cp)-1]=top.Node.Val
rs = append(rs, cp)
}
if top.Node.Right != nil {
st = append(st, Stack{
Node:top.Node.Right,
Sum: top.Sum + top.Node.Val,
Path: append(top.Path, top.Node.Val),
})
}
if top.Node.Left != nil {
st = append(st, Stack{
Node:top.Node.Left,
Sum: top.Sum + top.Node.Val,
Path: append(top.Path, top.Node.Val),
})
}
}
return rs