import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
  /*难点:用re 存贮 left+right+root的场景,这个场景无法包含更早的root节点*/
    static long re = Integer.MIN_VALUE;
    
    public int F (TreeNode root){
        long left = Integer.MIN_VALUE,right = Integer.MIN_VALUE;
        long max = Integer.MIN_VALUE;
        if(root==null) return 0;
        if(root.left!=null) left = F(root.left);
        if(root.right!=null) right = F(root.right);
        
        max = root.val;
        max = Math.max(max,root.val+left);
        max = Math.max(max,root.val+right);

        re = Math.max(re,root.val);
        re = Math.max(re,right);
        re = Math.max(re,left);
        re = Math.max(re,root.val+right+left);
        return (int) max;
    }
    
    public int maxPathSum (TreeNode root) {

        int tmp = F(root);
       return  Math.max((int)re,tmp);
    }
}