輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和爲輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。
示例:
給定如下二叉樹,以及目標和 sum = 22,5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:[
[5,4,11,2],
[5,8,4,5]
]提示:
節點總數 <= 10000
思路:遞歸遍歷,保存滿足條件的路徑。
遇到的坑:slice是一個指向底層的數組的指針結構體,使用append()函數的時候,沒有真正的拷貝,僅僅是地址索引,因爲必須開空間講數據copy()過去
func pathSum(root *TreeNode, sum int) [][]int {
tarNum := make([][]int, 0)
pathSumHelper(root, sum, []int{}, &tarNum)
return tarNum
}
func pathSumHelper(root *TreeNode, sum int, path []int, result *[][]int) {
if root == nil {
return
}
path = append(path, root.Val)
sum -= root.Val
if sum == 0 && root.Left == nil && root.Right == nil {
/*
* slice是一個指向底層的數組的指針結構體
* 因爲是先序遍歷,如果 root.Right != nil ,arr 切片底層的數組會被修改
* 所以這裏需要 copy arr 到 tmp,再添加進 ret,防止 arr 底層數據修改帶來的錯誤
*/
// *result = append(*result, path)
tmp := make([]int, len(path))
copy(tmp, path)
*result = append(*result, tmp)
}
pathSumHelper(root.Left, sum, path, result)
pathSumHelper(root.Right, sum, path, result)
}