• 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);
        }
    }
  • 相关阅读:
    C#将一个字符串数组的元素的顺序进行反转
    C#找出100内所有的素数/质数
    C#流程控制for循环语句,水仙花数。
    C# 常用的操作文件夹的方法
    Element UI
    JS
    JS
    PHP基础算法
    js实现csv下载
    el-dialog“闪动”解决办法
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7675355.html
Copyright © 2020-2023  润新知