LeetCode-in-Dart

124. Binary Tree Maximum Path Sum

Hard

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 1:

Input: root = [1,2,3]

Output: 6

Explanation: The optimal path is 2 -> 1 -> 3 with a path sum of 2 + 1 + 3 = 6.

Example 2:

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.

Constraints:

Solution

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *   int val;
 *   TreeNode? left;
 *   TreeNode? right;
 *   TreeNode([this.val = 0, this.left, this.right]);
 * }
 */
class Solution {
  int _max = -999999999; // Use a large negative value instead of -double.infinity.toInt()

  int _helper(TreeNode? root) {
    if (root == null) {
      return 0;
    }

    // Avoid negative values by comparing with 0
    int left = _helper(root.left).clamp(0, 999999999);
    int right = _helper(root.right).clamp(0, 999999999);

    int current = root.val + left + right;

    // Update max if current path sum is greater
    if (current > _max) {
      _max = current;
    }

    // Return the max path sum that can be used by the parent node
    return root.val + left.max(right);
  }

  int maxPathSum(TreeNode? root) {
    _helper(root);
    return _max;
  }
}

extension IntExtension on int {
  int max(int other) => this > other ? this : other;
}