給定一個非空二叉樹,返回其最大路徑和。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