【Leetcode】124. 二叉樹中的最大路徑和

題目

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

Leetcode名企之路
手撕代碼QQ羣:805423079, 羣密碼:1024im

相關文章
相關標籤/搜索