码迷,mamicode.com
首页 > 其他好文 > 详细

lintcode94- Binary Tree Maximum Path Sum- medium

时间:2017-10-16 09:42:57      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:hang   width   init   通过   ima   dma   oss   左右   com   

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

标签:hang   width   init   通过   ima   dma   oss   左右   com   

原文地址:http://www.cnblogs.com/jasminemzy/p/7675355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!