Maximum Path Sum
// https://leetcode.com/problems/binary-tree-maximum-path-sum/description/
// 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.
// Ex1:
// Input: root = [1, 2, 3]
// Output : 6
// Explanation : The optimal path is 2 -> 1 -> 3 with a path sum of 2 + 1 + 3 = 6.
// Ex2:
// 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.
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
class TreeNode {
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v) : val(v), left(nullptr), right(nullptr) {}
};
// Time: O(n), Space: O(n)
int helper(TreeNode* curr, int& res) {
if (!curr) {
return 0;
}
int l = helper(curr->left, res);
int r = helper(curr->right, res);
res = max(res, curr->val);
res = max(res, curr->val + l);
res = max(res, curr->val + r);
res = max(res, curr->val + l + r);
return max(curr->val, max(curr->val + l, curr->val + r));
}
int maxPathSum(TreeNode* root) {
if (!root) return 0;
int res = INT_MIN;
helper(root, res);
return res;
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
assert(maxPathSum(root) == 6);
root = new TreeNode(-10);
root->left = new TreeNode(9);
root->right = new TreeNode(20);
root->right->left = new TreeNode(15);
root->right->right = new TreeNode(7);
assert(maxPathSum(root) == 42);
return 0;
}```
Last updated