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

[LeetCode]124 Binary Tree Maximum Path Sum

时间:2015-01-07 19:14:02      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:leetcode

https://oj.leetcode.com/problems/binary-tree-maximum-path-sum/

http://blog.csdn.net/linhuanmars/article/details/22969069

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int maxPathSum(TreeNode root) {
        
        if (root == null)
            return 0;
        
        Result result = new Result();
        result.value = Integer.MIN_VALUE;
        visit(root, result);
        return result.value;
    }
    
    Values visit(TreeNode node, Result result)
    {
        int full = 0;
        int sub = 0;
        
        if (node.left == null && node.right == null)
        {
            sub = node.val;
            full = sub;
        }
        else if (node.left != null && node.right == null)
        {
            Values leftvalues = visit(node.left, result);
            
            sub = max(node.val, node.val + leftvalues.sub);
            full = sub;
        }
        else if (node.left == null && node.right != null)
        {
            Values rightvalues = visit(node.right, result);
            
            sub = max(node.val, node.val + rightvalues.sub);
            full = sub;
        }
        else
        {
            // If curren node has both left and right
            // 
            // the maxpath passing this node would be
            // max( node.val,   this node only
            //      node.val + left.sub     this node with left sub tree
            //      node.val + right.sub    this node with right sub tree
            //      node.val + left.sub + right.sub     this path from its left subtree to right subtree
            //
            // However,
            // the maxpath when current node is subtree
            // it cannot be 
            // (node.val + left.sub + right.sub)
            Values leftvalues = visit(node.left, result);
            Values rightvalues = visit(node.right, result);
            sub = max(node.val,
                      node.val + leftvalues.sub,
                      node.val + rightvalues.sub);
            full = max(sub,
                       node.val + leftvalues.sub + rightvalues.sub);
        }
        
        result.value = max(result.value, full);
        return new Values(full, sub);
    }
    
    private int max(int...ints)
    {
        int r = Integer.MIN_VALUE;
        for (int i : ints)
            r = Math.max(r, i);
        return r;
    }
    
    private static class Values
    {
        // MathPath when passing this node.
        private int full;
        
        // MathPath when using this node as a sub tree.
        // NOTE
        // It is different from full that
        // current node must be endpoint.
        private int sub;
        
        Values(int full, int sub)
        {
            this.full = full;
            this.sub = sub;
        }
    }
    
    private static class Result
    {
        private int value;
    }
}


[LeetCode]124 Binary Tree Maximum Path Sum

标签:leetcode

原文地址:http://7371901.blog.51cto.com/7361901/1600192

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