一、问题描述
二、解题思路
因为各个节点的值可能为负数,初始化res(最大路径和)的值为最小整数:Integer.MIN_VALUE
我们这里使用深度遍历(递归)的方法,先看某一个子树的情况:
这里有一个技巧,如果左、右子树贡献的值小于0时,可以将这个值设置为0,等价于舍弃该子树。
此时最大值为:res=Math.max(res,rootVal+leftVal+rightVal)
这里的rootVal+leftVal+rightVal包含多种情况(在递归过程中在下面值内保持最大值,这里好好理解一下,很巧妙的感觉):
- 只有左子树:根节点和右子树一起贡献负值
- 左子树+根节点:此时右子树贡献负值:橘黄色箭头标识路径
- 只有根节点:左右子树均贡献负值
- 根节点+右子树:此时左子树贡献负值:蓝色箭头标识路径
- 只有右子树:左子树和根节点一起贡献负值
- 左子树+根节点+右子树贡献的值:红色箭头标识路径
三、代码实现
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
int res=Integer.MIN_VALUE;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型
*/
public int maxPathSum (TreeNode root) {
if(root==null){
return 0;
}
// 使用dfs记录路径和并返回res
dfs(root);
return res;
}
//从根节点深度遍历,
public int dfs(TreeNode root){
if(root==null){
return 0;
}
int leftchildVal=Math.max(dfs(root.left),0);
int rightchildVal=Math.max(dfs(root.right),0);
int maxval=leftchildVal>rightchildVal?leftchildVal:rightchildVal;
res=Math.max(res,root.val+leftchildVal+rightchildVal);
return root.val+maxval;
}
}
四、刷题链接
二叉树中的最大路径和_牛客题霸_牛客网