1. 程式人生 > 實用技巧 >124. 二叉樹中的最大路徑和 - 【遞迴/DFS/後序遍歷】

124. 二叉樹中的最大路徑和 - 【遞迴/DFS/後序遍歷】

給定一個非空二叉樹,返回其最大路徑和。

本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。

** 路徑可以從某個子節點向上經過父節點穿到另一個子樹,但不可以再穿回來

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    Integer max;

    
public int maxPathSum(TreeNode root) { subMaxPathSum(root); return max; } private int subMaxPathSum(TreeNode root) { if (root == null) return 0;
    // 節點的最大路徑和取決於該節點的值與該節點的左右子節點的最大貢獻值,如果某個子樹貢獻值為負數,就不要走這個子樹,貢獻值即變為0
int leftSubMax = Math.max(0, subMaxPathSum(root.left));
int rightSubMax = Math.max(0, subMaxPathSum(root.right)); int result = root.val + leftSubMax + rightSubMax;

    // max是最終結果,即遍歷過程中最長的路徑
if (max == null || result > max) {
            max = result;
        }

    // 某個節點的最大貢獻值 = 這個節點的值 + 其左/右子樹的最大貢獻值
return root.val + Math.max(leftSubMax, rightSubMax); } }