【685、力扣124】

44 阅读1分钟

这个解法使用了递归,在递归过程中计算每个节点的最大路径和,并更新全局最大路径和。具体来说,对于每个节点,我们先递归计算出它的左子树和右子树的最大路径和,然后判断是否选择左子树或者右子树。如果子树的最大路径和为负,则不选该子树。然后我们计算以当前节点为根的最大路径和,并更新全局最大路径和。最后返回当前节点的最大路径和给上层递归使用。

时间复杂度: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);
    }
}