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()
}
小程序应用
|