0x00 題目
給定一個二叉樹的根節點
root
和一個整數
targetSum
求該二叉樹裡
節點值
之和
等于
targetSum
的
路徑
的數目
路徑不需要從根節點
開始
也不需要在葉子節點
結束
但是路徑方向必須是
向下
的(隻能從父節點到子節點)
示例如圖:

0x01 思路
這道題目跟之前的一道題目類似:二叉樹路徑總和 II
方法一:
相當于要從
每個
節點出發,都要查找一遍
方法二:
經過每一層時,儲存目前節點的
值
從目前節點
向上
往
根
節點找
看是否存在
符合
條件的路徑
有種
“一步一回頭”
的意思
每往前走一步,就
回頭
計算一下路徑
看看是否存在
符合
條件的路徑
0x02 解法
語言:
Swift
樹節點:
TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法一:
private var count: Int = 0
func pathSum(_ root: TreeNode?, _ targetSum: Int) -> Int {
guard let root = root else { return 0 }
// 從根節點出發
path(root, targetSum)
// 遞歸左右節點
_ = pathSum(root.left, targetSum)
_ = pathSum(root.right, targetSum)
return count
}
func path(_ root: TreeNode?, _ sum: Int){
guard let root = root else { return }
if root.val == sum {
count += 1
}
// 往下層走,目标值減小
let val = sum - root.val
path(root.left, val)
path(root.right, val)
}
private var count = 0
func pathSum(_ root: TreeNode?, _ targetSum: Int) -> Int {
var paths: [Int] = []
dfs(root, targetSum, &paths)
return count
}
private func dfs(_ root: TreeNode?, _ sum: Int, _ paths: inout [Int]) {
guard let root = root else { return }
// 把目前節點值加入路徑
paths.append(root.val)
// 回頭計算路徑和
var currentSum = 0
var i = paths.count - 1
while i >= 0 {
currentSum += paths[i]
if (currentSum == sum) {
count += 1 // 符合條件加 1
}
i -= 1
}
// 遞歸子節點
dfs(root.left, sum, &paths)
dfs(root.right, sum, &paths)
// 把目前節點值移除,往回走,走其他路徑
paths.removeLast()
}