题目描述
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
递归
a
/ \
b c
有三种路径情况
- a+b+c //对应 max = Math.max(max,left+right+root.val);
- a+c+a的父节点 //对应 left =Math.max(0,dfs(root.left))中b取0;
- a+b+a的父节点 // 对应 right=Math.max(0,dfs(root.right))中c取0;
也就是当结点路径和为负数时,我们不选,而是用0代替
class Solution {
int max;
public int maxPathSum(TreeNode root) {
if(root==null) return 0;
max=root.val;
dfs(root);
return max;
}
public int dfs(TreeNode root){
if(root==null) return 0;
//若该子树路径和小于0,则舍弃。
int left =Math.max(0,dfs(root.left));
int right=Math.max(0,dfs(root.right));
max = Math.max(max,left+right+root.val);
return root.val+Math.max(left,right);
}
}