题目

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6
示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

题解

这道题虽然是标记成hard难度的题目,但是我觉得主要是因为需要处理的细节可能需要仔细考虑,倒不是因为题目本身比较复杂。我们很容易想到用递归去解这道题。
递归子问题:左子树的路径和 + 右子树的路径和 + 当前结点的数字

class Solution {
    private int maxSum;
    public int maxPathSum(TreeNode root) {
        maxSum = Integer.MIN_VALUE;
        helper(root);
        return maxSum;
    }

    private int helper(TreeNode root) {
        if (root == null) return 0;
        int leftSum = Math.max(helper(root.left), 0);
        // 和0比较,要么要这个分支,要么不要这个分支
        int rightSum = Math.max(helper(root.right), 0);
        // 当前节点路径下最大值和全局最大值做比较
        maxSum = Math.max(leftSum + rightSum + root.val, maxSum);
        // 返回的是左右子树中最大的 + 当前结点的值作为这棵树的路径。因为必须要走根节点。
        return Math.max(leftSum, rightSum) + root.val;
    }
}

考虑以下极端情况:

   -2
   / \
 -1  -3

Leetcode名企之路
手撕代码QQ群:805423079, 群密码:1024


Acceml
284 声望79 粉丝

码蹄疾,毕业于哈尔滨工业大学。