题目
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。链接
思路
又是个dfs,要求是任意节点到另一节点的路径,可以只有一个节点,节点中可有负数。
- dfs计算每个节点的最大贡献值。对于叶子节点,最大贡献值即为其本身。对于非叶子节点,其最大贡献值即为其本身加上
max(左子节点最大贡献值,右子节点最大贡献值)
。由于左右两边贡献都有负数的情况,负数肯定不能再加,所以需要把负数转换为零。 - 处理完节点的最大贡献值,就可以计算最大路径和了。因为最大路径和不一定经过根节点,所以它有可能是某三个节点的贡献构成的小分支,所以对每个节点计算以当前这个节点为根节点的最大路径和为多少。
即最大和maxSum = max(maxSum, root + leftMax + rightMax)
class Solution {
int maxSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return maxSum;
}
int dfs(TreeNode root){
if(root == null){
return 0;
}
int leftMax = Math.max(0, dfs(root.left));
int rightMax = Math.max(0, dfs(root.right));
//最大路径和:由根,左,右的贡献组成
maxSum = Math.max(maxSum, root.val + leftMax + rightMax);
//返回当前节点的最大贡献
return root.val + Math.max(leftMax, rightMax);
}
}