给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路:考虑每个点都能做成最大路径根节点的可能性,因此每个点都要计算以当前节点为路径根节点的最大路径和,与全局最大路径和比较,若大则更新全局的最大路径和。
考虑四种情况,选最大的即可
1、当前节点本身
2、当前节点+左孩子
3、当前节点+右孩子
4、当前节点+左孩子+右孩子 比较四个情况的最大值即可
然后判断选择哪条路径,毕竟是路径不能分叉,比较上述1、2、3点,选最大的一条路径的值返回给父节点计算。
class Solution {
public int MAX=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
int max = maxPath(root);
if(max>MAX){
return max;
}else{
return MAX;
}
}
public int maxPath(TreeNode root){
if(root==null){return 0;}
int max=root.val;
int retval=root.val;
int left = maxPath(root.left);
int right = maxPath(root.right);
if(root.val>max){max=root.val;retval=max;}
if(left+root.val>max){max=left+root.val;retval=max;}
if(right+root.val>max){max=right+root.val;retval=max;}
if(left+right+root.val>max){max=left+right+root.val;}
if(max>MAX){
MAX=max;
}
return retval;//统一要统计最大的,但是返回只返回一条路径的
}
}