leetcode 124 二叉树中的最大路径和
首先这道题第一个难点就是如何理解题意,题目中路径可以由任意结点出发,即不一定是由根结点出发,例如(9->-10->20)也是一条路径。
第二个难点就是怎么计算最大路径和呢?既然我们要计算最大路径和,那我们首先要在以每个结点为根结点的子树中寻找以该结点为起点的一条路径,使得该路径上的结点值之和最大。所以我们可以设计一个函数maxGain来求一个结点的最大贡献值。
具体而言,该函数的计算如下。
-
空结点的最大贡献值等于 0。
-
非空结点的最大贡献值等于结点值与其子结点中的最大贡献值之和(对于叶结点而言,最大贡献值等于节点值)。
但我们刚开始我们从根结点开始 ,我们没办法知道以根结点出发的路径最大值是多少,那我们不如在得到叶子结点的最大贡献值后,利用它来计算非叶子结点的最大贡献值。
接着,我们需要考虑当前结点和其左右子树可能构成的路径,以下则是可能的情况。
比较顺序:首先我们先看左中右组成的路径是否比最大路径和大,若不大,我们在比较左和右。
维护一个全局变量 maxSum 存储最大路径和,在递归过程中更新 maxSum 的值,最后得到的 maxSum 的值即为二叉树中的最大路径和。
代码如下:
class Solution {
public int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
findMax(root);
return max;
}
public int findMax(TreeNode root){
if(root == null){
return 0;
}
int leftGain = Math.max(findMax(root.left),0);//获取左右子树最大贡献值,若为负数则置为0
int rightGain = Math.max(findMax(root.right),0);
int PriceNewPath = root.val + leftGain + rightGain;
max = Math.max(max,PriceNewPath);//比较从左子树经过父结点到达右节点的路径是否比max大
return root.val + Math.max(leftGain,rightGain);//返回最大贡献值
}
}