题目描述
// 124. 二叉树中的最大路径和
// 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列
// 。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一
// 定经过根节点。
// 路径和 是路径中各节点值的总和。
// 给你一个二叉树的根节点 root ,返回其 最大路径和 。
// 定义答案保存位max。
// 定义函数pathSum(TreeNode node),计算以node作为根,其子树所能够
// 计算的路径和。之后我们层层递归下去,求每个结点node的pathSum,
// 并更新遍历到node节点时的最大路径和max,
// 如根结点的root的最大路径和是root.left和root.right路径和的叠加(保证root.
// left和root.right贡献的值不是负数),而root.left的最大路径和又是root.left
// .left和root.left.right的路径和的叠加(保证两子结点贡献值不是负数),以此
// 类推,我们都要更新给max。
// 我们先定义pathSum的递归终止条件,如果输入的node为null,返回0,说明
// 空结点贡献值为0。之后定义node的左子节点node.left的pathSum最大路径和,
// 记为leftPathSum,需要注意的数如果左子节点node.left的最大路径和是负数,
// 则直接截断置0,防止贡献值为负数。
// 然后再定义node的右子结点node.right的pathSum最大路径和,记为rightPathSum,
// 同样如果是负数贡献值,直接截断置0。
// 然后求当前遍历节点node的值node.val,和左子节点最大路径和leftPathSum,
// 和右子结点最大路径和rightPathSum的求和,拿来更新max(比max大就赋给max)。
// 所以每次调用pathSum遍历node节点的时候都会更新一次max。
// 最后pathSum函数返回当前值node.val和左子节点/右子结点路径最大和之中,最大
// 的那个求和,使得路径和只能向一个方向延伸。
//
//
// 执行用时:1 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:40.4 MB, 在所有 Java 提交中击败了54.24%的用户
class Solution {
int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
pathSum(root);
return max;
}
public int pathSum(TreeNode node) {
if (node == null)
return 0;
int leftPathSum = Math.max(pathSum(node.left), 0);
int rightPathSum = Math.max(pathSum(node.right), 0);
max = Math.max(max, node.val + leftPathSum + rightPathSum);
return node.val + Math.max(leftPathSum, rightPathSum);
}
}