lintcode94- Binary Tree Maximum Path Sum- medium
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