Skip to content
本页目录

路径和篇

路径总和

112. 路径总和

解题思路

JavaScript
const hasPathSum = (root, tarSum) => {
  if (!root) return false
  const dfs = (node, curSum) => {
    if (!node) return false
    if (!node.left && !node.right) return curSum === tarSum
    return dfs(node.left, curSum + node.left.val)
      || dfs(node.right, curSum + node.right.val)
  }
  return dfs(root, root.val)
}

时间复杂度:O(n);空间复杂度:O(n)

路径总和 II

113. 路径总和 II

解题思路

JavaScript
const pathSum = (root, tarSum) => {
  if (!root) return []
  const ret = []
  const dfs = (node, path, curSum) => {
    if (!node.left && !node.right && curSum === tarSum) return ret.push(path)
    node.left && dfs(node.left, [...path, node.left.val], curSum + node.left.val)
    node.right && dfs(node.right, [...path, node.right.val], curSum + node.right.val)
  }
  dfs(root, [root.val], root.val)
  return ret
}

时间复杂度:O(n);空间复杂度:O(n)

路径总和 III

437. 路径总和 III

解题思路

JavaScript
const pathSum = (root, tarSum) => {
  let ret = 0
  const map = new Map()
  const dfs = (node, preSum) => {
    if (!node) return 0
    map.set(preSum, (map.get(preSum) || 0) + 1)
    const curSum = preSum + node.val
    ret += map.get(curSum - tarSum) || 0
    dfs(node.left, curSum)
    dfs(node.right, curSum)
    // 避免重复计算
    map.set(preSum, map.get(preSum) - 1)
  }
  dfs(root, 0)
  return ret
}

时间复杂度:O(n);空间复杂度:O(n)

最大路径和

剑指 Offer II 051. 二叉树中的最大路径和

解题思路

JavaScript
const maxPathSum = root => {
  let max = -Infinity
  const dfs = node => {
    if (!node) return 0
    // 左树最大贡献(小于0,就不贡献)
    const maxL = Math.max(dfs(node.left), 0)
    // 右树最大贡献
    const maxR = Math.max(dfs(node.right), 0)
    max = Math.max(max, maxL + node.val + maxR)
    return node.val + Math.max(maxL, maxR)
  }
  dfs(root)
  return max
}

时间复杂度:O(n);空间复杂度:O(n)

最大同值路径

剑指 Offer II 051. 二叉树中的最大路径和

解题思路

JavaScript
const longestUnivaluePath = root => {
  let max = 0
  const dfs = node => {
    if (!node) return 0
    let maxL = dfs(node.left)
    let maxR = dfs(node.right)
    maxL = node.left && node.left.val === node.val ? ++maxL : 0
    maxR = node.right && node.right.val === node.val ? ++maxR : 0
    max = Math.max(max, maxL + maxR)
    return Math.max(maxL, maxR)
  }
  dfs(root)
  return max
}

时间复杂度:O(n);空间复杂度:O(n)

路径数字和

129. 求根节点到叶节点数字之和

解题思路

JavaScript
const sumNumbers = root => {
  let sum = 0
  const dfs = (node, num) => {
    if (!node) return 0
    if (!node.left && !node.right) {
      return sum += num
    }
    const left = node.left && dfs(node.left, num * 10 + node.left.val)
    const right = node.right && dfs(node.right, num * 10 + node.right.val)
    return left + right
  }
  dfs(root, root.val)
  return sum
}

时间复杂度:O(n);空间复杂度:O(n)