【leetcode】124. 二叉树中的最大路径和

76 阅读1分钟

leetcode-124.png

  • 对于每个节点,计算从该节点出发的左子树和右子树的最大路径和。
  • 对于当前节点,可以选择左子树和右子树中的一个路径(如果路径和为负数,可以不选),或者不选择任何子树,只使用当前节点的值。
  • 计算路径和的四种情况:
    • 只包括当前节点的值。
    • 当前节点 + 左子树路径和。
    • 当前节点 + 右子树路径和。
    • 当前节点 + 左子树路径和 + 右子树路径和(即横跨当前节点的路径)。
  • 更新全局最大路径和。
  • 对于递归返回值,应该返回包含当前节点和它的一条子树路径(或不含子树)的最大路径和。
var maxPathSum = function (root) {
    let maxSum = -Infinity
    var dfs = function (node) {
        if (!node) return 0
        let leftSum = Math.max(0, dfs(node.left))
        let rightSum = Math.max(0, dfs(node.right))
        let currentSum = leftSum + rightSum + node.val
        // 更新最大值
        maxSum = Math.max(maxSum, currentSum)
        // 返回当前节点的左右子树最大值(包含当前节点
        return node.val + Math.max(leftSum, rightSum)
    }
    dfs(root)
    return maxSum
};