
- 对于每个节点,计算从该节点出发的左子树和右子树的最大路径和。
- 对于当前节点,可以选择左子树和右子树中的一个路径(如果路径和为负数,可以不选),或者不选择任何子树,只使用当前节点的值。
- 计算路径和的四种情况:
- 只包括当前节点的值。
- 当前节点 + 左子树路径和。
- 当前节点 + 右子树路径和。
- 当前节点 + 左子树路径和 + 右子树路径和(即横跨当前节点的路径)。
- 更新全局最大路径和。
- 对于递归返回值,应该返回包含当前节点和它的一条子树路径(或不含子树)的最大路径和。
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
};