import java.util.*;

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

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型
     */
    
    int max = Integer.MIN_VALUE ;
    HashMap<TreeNode , Integer> map = new HashMap<>() ;
    HashMap<TreeNode , Integer> map2 = new HashMap<>() ;
    public int maxPathSum (TreeNode root) {
        if(root == null) return 0 ;
        pre(root) ;
        return max ;
    }
    //中序遍历
    public void pre(TreeNode root) {
        if(root == null) return ;
        int one = help(root) ;
        int two = map2.get(root) ;
        int res = max(one , two) ;
        max = max(res , max) ;
        pre(root.left) ;
        pre(root.right) ;
    }
    public int help(TreeNode root) {
        if(root == null) return -1001 ;
        Integer get = map.get(root) ;
        if(get != null) return get ;
        if(root.left == null && root.right == null) {
            map.put(root , root.val) ;
            map2.put(root , root.val) ;
            return root.val ;
        } 
        int l = help(root.left) ;
        int r = help(root.right) ;
        int res = max(l + root.val , r + root.val , root.val) ;
        map.put(root , res) ;
        map2.put(root , l + r + root.val) ;
        return res ;
        
    }
    public int max(int...args) {
        int max = Integer.MIN_VALUE ;
        for(int a : args) {
            if(a > max) {
                max = a ;
            }
        }
        return max ;
    }
}