1. 程式人生 > >lintcode94- Binary Tree Maximum Path Sum- medium

lintcode94- Binary Tree Maximum Path Sum- medium

註釋 paths 2個 str this 題目 and med private

Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

Example

Given the below binary tree:

  1
 / 2   3

return 6.

總結:二叉樹裏起始點和終結點都任意的題目,其實可以考慮成接龍題。其實對於某個節點單獨拎出來想的時候,選擇還是有窮個的。1.自己;2.向左接龍;3.向右接龍;4.左右都接龍;(5.左邊斷long;6.右邊斷long)。類似題型裏那個連續數字接龍的題目:就只有1, 2, 3, 4。http://www.cnblogs.com/jasminemzy/p/7666076.html

本題解析 :出處 http://www.cnblogs.com/yuzhangcmu/p/4172855.html

計算樹的最長path有2種情況:

1. 通過根的path.

(1)如果左子樹從左樹根到任何一個Node的path大於零,可以鏈到root上

(2)如果右子樹從右樹根到任何一個Node的path大於零,可以鏈到root上

2. 不通過根的path. 這個可以取左子樹及右子樹的path的最大值。

所以創建一個inner class:

記錄2個值:

1. 本樹的最大path。(wholeMax)

2. 本樹從根節點出發到任何一個節點的最大path. (linkedMax)

細節:用Integer.MIN_VALUE作為警示符的時候,不能讓可能取到警示符的兩個值相加,會溢出,有時候要用max(0, 可能是警示符的變量)來限制下,就是如果取到的是警示符,那就不要加了。見註釋。

技術分享

/**
 * 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 class ResultType{ public int wholeMax; public int linkedMax; public ResultType(int wholeMax, int linkedMax) { this.wholeMax = wholeMax; this.linkedMax = linkedMax; } } public int maxPathSum(TreeNode root) { // write your code here ResultType result = helper(root); return result.wholeMax; } private ResultType helper(TreeNode root) { if (root == null) { return new ResultType(Integer.MIN_VALUE, Integer.MIN_VALUE); } ResultType left = helper(root.left); ResultType right = helper(root.right); int linkedMax; int wholeMax; //千萬小心因為你用的警示符是Integer.MIN_VALUE,所以你不能隨便讓答案加,要用0下限來限制,避免溢出。 //如 linkedMax = Math.max (root.val, root.val + left.linkedMax)看似邏輯通順,但仔細看就發現可能產生溢出錯誤!! linkedMax = root.val + Math.max(Math.max(0, left.linkedMax), right.linkedMax); int cross = root.val; cross += Math.max(0, left.linkedMax); cross += Math.max(0, right.linkedMax); wholeMax = Math.max(linkedMax, cross); wholeMax = Math.max(wholeMax, left.wholeMax); wholeMax = Math.max(wholeMax, right.wholeMax); return new ResultType(wholeMax, linkedMax); } }

lintcode94- Binary Tree Maximum Path Sum- medium