1. 程式人生 > >【多次過】Lintcode 94. 二叉樹中的最大路徑和

【多次過】Lintcode 94. 二叉樹中的最大路徑和

給出一棵二叉樹,尋找一條路徑使其路徑和最大,路徑可以在任一節點中開始和結束(路徑和為兩個節點之間所在路徑上的節點權值之和)

樣例

給出一棵二叉樹:

       1
      / \
     2   3 

返回 6


解題思路:

利用分治法 解決問題
需要一個變數不斷記錄帶有root點的路徑的最大值 curr_max 區域性變數
需要另一個變數記錄當前的最大路徑值 max 類變數
最後返回 當前的最大路徑值

思路:
有4種情況要考慮
left + root
right + root
root
left + right + root

不斷往上傳遞的值 只可能是 1, 2, 3中的一種
第四種情況只可能儲存在 max裡面 而不可能在 curr_max,因為第四種情況可能出現^這種的分支結構,如果向上傳遞就不能構成一條路徑。

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */

public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: An integer
     */
    private int max = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        // write your code here
        helper(root);
        
        return max;
    }
    
    private int helper(TreeNode root){
        if(root == null)
            return 0;
        
        //Divide
        int left = helper(root.left);
        int right = helper(root.right);
        
        //Conquer
        int curMax = Math.max(root.val, Math.max(left+root.val, right+root.val)); //root -> any
        max = Math.max(max, Math.max(curMax,left+root.val+right));  //any -> any
        
        return curMax;
    }
}