124. 二叉树中的最大路径和
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
解:
- 对于每个节点来说,它的最大值可能性分析
- p1: 当前节点值大于0时,取左子树最大值 + 当前值,否则取左子树最大值(即当前值大于0就把左子树和当前节点连一起,否则不连)
- p2: 当前节点值大于0时,取右子树最大值 + 当前值, 否则取右子树最大值(即当前值大于0就把左子树和当前节点连一起,否则不连)
- p3:取左右子树最大值 + 当前值(即把左子树和当前节点和右子树连一起)
- p4:取当前值(即只保留当前节点)
- 设置全局变量maxSum,取每个节点的最大值跟全局max比较
- 由于题目限制每个节点只在路径中出现一次,这就意味着对一个节点来说,它向上层节点返回的时候,它最多只能保留左右子树的其中一颗子树。所以从【连接左子树,连接右子树,两棵树都不连】三者中选出最大情况返回
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
};