思路
对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况:
- 其左右子树中所构成的和路径值较大的那个加上该节点的值后向父节点回溯构成最大路径
- 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
oneSideMax(root);
return res;
}
public int oneSideMax(TreeNode root) {
if(root == null) return 0;
// 如果子树路径和为负则应当置0表示最大路径不包含子树
int left = Math.max(0, oneSideMax(root.left));
int right = Math.max(0, oneSideMax(root.right));
// 判断在该节点包含左右子树的路径和是否大于当前最大路径和
res = Math.max(res, (left + right + root.val));
return Math.max(left, right) + root.val;
}
}