用递归来做:
子树root左子树 右子树
result要从三个值中选取:
1. 左子树sum和右子树的sum + 当前子树节点(左子树sum是指的包含当前左子树的root的最大路径值和,右子树sum类似)
2. 要么依旧是以前保存的res,也就是再左子树和右子树处理完之后的,最大res
3. 要么是新的sum,也就是从左子树和右子树中挑选一个最大的sum,加上当前子树root生成的新sum
其实简单点就是新加入一个子树root进来时,变化的分支就是看(左/右)sum+节点,要么就是直接左sum+右sum+节点。所以就要用这两个新的变量与原有的最大路径值和做比较
在计算sum时,得注意一点是如果左子树或右子树的sum为负值的话,则sum就直接为当前子树root。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
int res;
public int maxPathSum(TreeNode root) {
res = Integer.MIN_VALUE;
maxPathSumRe(root);
return res;
}
int maxPathSumRe(TreeNode node)
{
if (node == null) return 0;
int l = maxPathSumRe(node.left);
int r = maxPathSumRe(node.right);
int maxSub = (l > r) ? l : r;
int sum = (node.val > maxSub + node.val) ? node.val : node.val + maxSub;
res = res > sum ? res : sum;
res = node.val + l + r > res ? node.val + l + r : res;
return sum;
}
}