1. 程式人生 > 其它 >LeetCode 0124 Binary Tree Maximum Path Sum

LeetCode 0124 Binary Tree Maximum Path Sum

原題傳送門

1. 題目描述

2. Solution 1

1、思路分析
遞迴。先計算從給定結點的最大貢獻值,具體地,就是在以該結點為根結點的子樹中尋找以該結點為起點的一條路徑,使得該路徑上的結點值之和最大。計算方法: 1> 空結點的最大貢獻值為0;2> 非空結點的最大貢獻值等於結點值與其子結點中的最大貢獻值之和。(對於葉結點而言,最大貢獻值等於節點值)。
例如,考慮如下二叉樹。

-10
/
9 20
/
15 7

葉節點 9、15、7 的最大貢獻值分別為 9、15、7。

得到葉節點的最大貢獻值之後,再計算非葉節點的最大貢獻值。節點 20 的最大貢獻值等於 20+max⁡(15,7)=35,節點 −10 的最大貢獻值等於 −10+max⁡(9,35)=25。

根據函式maxGain得到每個結點的最大貢獻值之後,如何得到二叉樹的最大路徑和?對於二叉樹的一個結點,該結點的最大路徑和取決於該結點的值與該結點的值與該結點的左右子結點的最大貢獻值,如果子結點的最大貢獻值為正,則計入該結點的最大路徑和,否則不計入該結點的最大路徑和。維護一個全域性變數result儲存最大路徑和,在遞迴過程中更新result的值。

2、程式碼實現

package Q0199.Q0124BinaryTreeMaximumPathSum;

import DataStructure.TreeNode;

/*
    Ideas:
    A path from start to end, goes up on the tree for 0 or more steps, then goes down for 0 or more steps. Once it
    goes down, it can't go up. Each path has a highest node, which is also the lowest common ancestor of all other
    nodes on the path.

    A recursive method maxPathDown(TreeNode node)
        (1) computes the maximum path sum with highest node is the input node, update maximum if necessary
        (2) returns the maximum sum of the path that can be extended to input node's parent.
 */
public class Solution {
    private int result = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxPathDown(root);
        return result;
    }

    private int maxPathDown(TreeNode root) {
        if (root == null) return 0;
        int left = Math.max(0, maxPathDown(root.left));
        int right = Math.max(0, maxPathDown(root.right));
        result = Math.max(result, left + right + root.val);
        return Math.max(left, right) + root.val;
    }
}

3、複雜度分析
時間複雜度: O(n)
空間複雜度: O(n)