leetcode **124. 二叉樹中的最大路徑和

【題目】**124. 二叉樹中的最大路徑和

給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。

示例 1:

輸入: [1,2,3]

       1
      / \
     2   3

輸出: 6

示例 2:

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

   -10
   / \
  9  20
    /  \
   15   7

輸出: 42

【解題思路1】遞歸

主要是兩種情況:

  1. 當前節點作爲拐點,路徑是從當前節點的左邊到當前節點的右邊
  2. 當前節點不是拐點,還要繼續向上走
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int maxSum = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        dfs(root);
        return maxSum;
    }

    public int dfs(TreeNode node) {
        if (node == null) {
            return 0;
        }
        
        // 遞歸計算左右子節點的最大貢獻值,最大貢獻值大於0纔會選取對應子節點
        int leftGain = Math.max(dfs(node.left), 0);
        int rightGain = Math.max(dfs(node.right), 0);

        // 節點的最大路徑和=該節點的值與該節點+左右子節點的最大貢獻值
        int priceNewpath = node.val + leftGain + rightGain;

        // 更新最大路徑和
        maxSum = Math.max(maxSum, priceNewpath);

        // 返回這一層遞歸的節點的最大貢獻值到上一層,即要在左右子節點裏選一個出來
        return node.val + Math.max(leftGain, rightGain);
    }
}
class Solution {
    private int max = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        dfs(root);
        return max;
    }

    public int dfs(TreeNode root) {
        if (root == null) return 0;

        int left = dfs(root.left);
        int right = dfs(root.right);

        //對於當前節點cur來說,最大值可以爲cur, cur+left, cur+right, cur+left+right
        //情況1,可以繼續往上走的路徑,即left和right不同時選取
        int cur = root.val;
        int path = Math.max(cur, Math.max(cur + left, cur + right));
        max = Math.max(max,path);

        //情況2,從當前節點的左邊到右邊構成路徑,不在往當前節點的父節點走
        int path2 = Math.max(path, cur + left + right);
        max = Math.max(max, path2);

        return path; //返回到上一層遞歸,所以要返回情況1
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章