【算法】劍指 Offer 34. 二叉樹中和爲某一值的路徑

輸入一棵二叉樹和一個整數,打印出二叉樹中節點值的和爲輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

示例:
給定如下二叉樹,以及目標和 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)
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章