这个解法使用了递归,在递归过程中计算每个节点的最大路径和,并更新全局最大路径和。具体来说,对于每个节点,我们先递归计算出它的左子树和右子树的最大路径和,然后判断是否选择左子树或者右子树。如果子树的最大路径和为负,则不选该子树。然后我们计算以当前节点为根的最大路径和,并更新全局最大路径和。最后返回当前节点的最大路径和给上层递归使用。
时间复杂度:O(n),其中n是二叉树中的节点数。我们需要遍历每个节点,计算以该节点为根的最大路径和。
空间复杂度:O(h),其中h是二叉树的高度。递归过程中需要使用O(h)的栈空间。
class Solution {
int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if (root == null) {
return 0;
}
calculateMaxSum(root);
return maxSum;
}
private int calculateMaxSum(TreeNode node) {
if (node == null) {
return 0;
}
// 计算左子树的最大路径和,如果为负,则不选左子树
int leftSum = Math.max(0, calculateMaxSum(node.left));
// 计算右子树的最大路径和,如果为负,则不选右子树
int rightSum = Math.max(0, calculateMaxSum(node.right));
// 更新全局最大路径和
maxSum = Math.max(maxSum, node.val + leftSum + rightSum);
// 返回当前节点的最大路径和
return node.val + Math.max(leftSum, rightSum);
}
}