算法学习记录(九十一)

74 阅读2分钟

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

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

image.png

解:

  1. 对于每个节点来说,它的最大值可能性分析
    • p1: 当前节点值大于0时,取左子树最大值 + 当前值,否则取左子树最大值(即当前值大于0就把左子树和当前节点连一起,否则不连)
    • p2: 当前节点值大于0时,取右子树最大值 + 当前值, 否则取右子树最大值(即当前值大于0就把左子树和当前节点连一起,否则不连)
    • p3:取左右子树最大值 + 当前值(即把左子树和当前节点和右子树连一起)
    • p4:取当前值(即只保留当前节点)
  2. 设置全局变量maxSum,取每个节点的最大值跟全局max比较
  3. 由于题目限制每个节点只在路径中出现一次,这就意味着对一个节点来说,它向上层节点返回的时候,它最多只能保留左右子树的其中一颗子树。所以从【连接左子树,连接右子树,两棵树都不连】三者中选出最大情况返回
var maxPathSum = function(root) {
    let maxSum = -Infinity
    function getRes (node) {
        if (!node) return -Infinity
        const leftMax = getRes(node.left)
        const rightMax = getRes(node.right)
        const p1 = node.val > 0 ? leftMax + node.val : leftMax
        const p2 = node.val > 0 ? rightMax + node.val : rightMax
        const p3 = leftMax + rightMax + node.val
        const p4 = node.val
        maxSum = Math.max(p1, p2, p3, p4, maxSum)
        return Math.max(leftMax + p4, rightMax + p4, p4)
    }
    getRes(root)
    return maxSum
};