采用后序遍历。当访问当前节点值的时候,统计并保存两个变量:以当前节点为一端的路径的最大路径和,全局最大路径和。

当访问当前节点值的时候,已知的值有: 当前全局最大路径和Max,以左子树根节点为一端的路径的最大路径和L,以右子树根节点为一端的路径的最大路径和R,当前节点值V。

求当前全局最大路径和Max,正常比较需要比较6次,①V与Max②Max与V+L③Max与V+R④Max与V+L+R⑤Max与L⑥Max与R。

但是由于采用的是递归,左右子树都已经跟Max比较过了,因此⑤和⑥是多余的。因此仅需要比较4次。

利用数学不等式分析发现,如果L、R都是正数,那么当前全局最大路径和Max = Max{Max,V+L+R},①②③都是多余的。

如果L或者R为负数,那么相应的②或者③是不必要的。也就是说,当L或者R为负数时,令L0=0,R0=0,分别取代L和R,代入④即可求取当前全局最大路径和Max——进而可以省略①②③。

【注:笔者原先采用的是6次比较的方式,参考了讨论区的代码,进一步分析后总结出上述内容。以下代码参考自@韩迅 】

import java.util.*;

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

public class Solution {
    int maxValue;
    public int maxPathSum(TreeNode root) {
        maxValue = Integer.MIN_VALUE;
        maxPathDown(root);
        return maxValue;
    }
    private int maxPathDown(TreeNode node){
        if(node==null)
            return 0;
        int left = Math.max(0, maxPathDown(node.left));
        int right = Math.max(0, maxPathDown(node.right));
        maxValue = Math.max(maxValue, left + right + node.val);
        return Math.max(left, right) + node.val;
    }
}