Given a non-empty binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.
Example 1:
Input: [1,2,3]
1
/ \
2 3
Output: 6
Example 2:
Input: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
Output: 42
For every node
, there are six possible ways to get the max
path sum:
node.val
node.val
plus the max sum of a path that ends with
node.left
.
node.val
plus the max sum of a path that starts with
node.right
.
node.val
plus the max sum of both paths.node.val
(the max sum of both paths are negative).
node.val
(disconnected)
node.left
subtree.
node.right
subtree.
There are two ways to implement this.
Define a function that returns two values. The max sum of a path that may
or may not end with root
node, and the max sum of the path
that ends with root
node.
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
let maxPathSum = function (root) {
return Math.max(..._maxPathSum(root));
};
/**
* @param {TreeNode} root
* @return {number[]}
*/
function _maxPathSum(root) {
if (!root) {
return [-Infinity, -Infinity];
}
const left = _maxPathSum(root.left);
const right = _maxPathSum(root.right);
return [
Math.max(
left[0],
right[0],
root.val + Math.max(0, left[1], right[1], left[1] + right[1])
),
Math.max(left[1], right[1], 0) + root.val,
];
}
Just return the later (max sum of a path that ends with
root
). Maintain a global variable to store the disconnected
max sum.
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
let maxPathSum = function (root) {
const global = { max: -Infinity };
_maxPathSum(root, global);
return global.max;
};
/**
* @param {TreeNode} root
* @param {object} global
* @param {number} global.max
* @return {number[]}
*/
function _maxPathSum(root, global) {
if (!root) {
return -Infinity;
}
const left = _maxPathSum(root.left, global);
const right = _maxPathSum(root.right, global);
const localMax = Math.max(left, right, 0) + root.val;
global.max = Math.max(global.max, localMax, root.val + left + right);
return localMax;
}
☆: .。. o(≧▽≦)o .。.:☆☆: .。. o(≧▽≦)o .。.:☆☆: .。. o(≧▽≦)o .。.:☆
☆: .。. o(≧▽≦)o .。.:☆☆: .。. o(≧▽≦)o .。.:☆