给定一个非空二叉树,返回其最大路径和。spa
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不必定通过根节点。code
示例 1:递归
输入: [1,2,3]rem
1 / \ 2 3
输出: 6
示例 2:it
输入: [-10,9,20,null,null,15,7]io
-10 / \ 9 20 / \ 15 7
输出: 42class
这道题虽然是标记成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
手撕代码QQ群:805423079, 群密码:1024im