Table of Contents
Problem Statement
Binary Tree Maximum Path Sum LeetCode Solution – A path in a binary tree is a sequence of nodes where each pair of adjacent nodes in the sequence has an edge connecting them. A node can only appear in the sequence at most once. Note that the path does not need to pass through the root.
The path sum of a path is the sum of the node’s values in the path.
Given the root of a binary tree, return the maximum path sum of any non-empty path.
Example
Test Case 1:
Input:
root = [-10, 9, 20, null, null, 15, 7]

Output:
42
Explanation
The optimal path is 15 -> 20 -> 7 with a path sum of 15 + 20 + 7 = 42 .

Approach:
The idea behind this problem is the following:
- For every node of the tree, find the max among : leftSum, rightSum, root.val, leftSum + root.val , rightSum + root.val, leftSum + rightSum + root.val
- Save the max to the global max
- Now, you can’t return the global max. You need to return the max of leftSum + root.val, rightSum + root.val or root.val. This ensures that you are looking at a contiguous series of nodes.
The idea is also DFS. From bottom to up, at every node, we have four choices:
- the left sub-path ==> node ==> the right sub-path.
- the left sub-path ==> node ==> upper. The left sub-path may yield a negative sum, in which case we set node->left sub-path to zero.
- the right sub-path ==> node ==>upper. The right sub-path may yield a negative sum, in which case we set node->right sub-path to zero.
- 0 ==> upper, which means we abandon the entire tree rooted at this node because of a negative-sum.
Noted: Negative node values are possible.
Code for Binary Tree Maximum Path Sum
C++ Program
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
private:
int maxPathSum(TreeNode *root, int &ma)
{
if (!root)
return 0;
int left = maxPathSum(root->left, ma);
int right = maxPathSum(root->right, ma);
ma = max(ma, root->val + left + right);
return max(max(0, max(left, right)) + root->val, 0);
}
public:
int maxPathSum(TreeNode* root)
{
if (!root)
return INT_MIN; //This INT_MIN is just to comply with the judge.
int ma = root->val;
maxPathSum(root, ma);
return ma;
}
};Java Program
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return maxSum;
}
public int dfs(TreeNode node) {
if (node == null) return 0;
int left = Math.max(dfs(node.left), 0);
int right = Math.max(dfs(node.right), 0);
maxSum = Math.max(maxSum, node.val + left + right);
return node.val + Math.max(left, right);
}
}Complexity Analysis for Binary Tree Maximum Path Sum LeetCode Solution
Time Complexity: O(N)
Space Complexity: O(H)