124. Binary Tree Maximum Path Sum

    /*
     * 124. Binary Tree Maximum Path Sum
     * 11.21 By Mingyang 刚开始想只用一个int
     * max来传参,但是后面发现无论怎么改,return的max都要被附上初值
     * 所以我们这里出了一个全局变量,这里的任何一个path都要经过一个最高的点,那么这个最高的点就在
     * root里面的node,那么每次都是最大的值更新。所以node表示一定经过的。
     * 那么返回的整数就是如果最大的path还要通往父节点能提供的最大值。也就是我能提供给父节点一个接口,
     * 并且最大的值。
     * 关键点1:明确递归函数的返回值是什么:
     * 这本题中返回值表示通过root节点能走到root的parent的最大和,这个值作为返回对象返给调用父函数
     * 因为在Java中无法像C++一样引用传值或者利用指针传值,以前的解决办法是用全局变量
     */
    int maxValue;
    public int maxPathSum(TreeNode root) {
        maxValue = Integer.MIN_VALUE;
        maxPathDown(root);
        return maxValue;
    }
    private int maxPathDown(TreeNode node) {
        if (node == null) return 0;
        int left = Math.max(0, maxPathDown(node.left));
        int right = Math.max(0, maxPathDown(node.right));
        maxValue = Math.max(maxValue, left + right + node.val);
        /*
         * 这个地方可能有点疑惑,你可能会想
         *   -100
         *  19   14
         *  这种情况maxValue肯定还是19,那么为什么还要return 10+(-100)呢?
         *  那是因为maxValue才是我们最终需要的结果,这里的return的只是相当于为更上一级提供了一个接口
         *  给他们提供一种更大的可能性,万一更上面的root是1000,那么这个接口就用上了。就可以获得正确的结果
         *  所以我们这里需要的只是return一个可能性,并不影响最大的结果
         */
        return Math.max(left, right) + node.val;
    }
    //那你说我不用全局变量,那就只能用数组:
    public int maxPathSum1(TreeNode root) {
        int[] max = new int[1];
        max[0] = Integer.MIN_VALUE;
        maxPathSum1(max, root);
        return max[0];
    }
    private int maxPathSum1(int[] max, TreeNode root){
        if(root == null)
            return 0;
        int leftMax =  Math.max(0, maxPathSum1(max, root.left));
        int rightMax = Math.max(0, maxPathSum1(max, root.right));
        max[0] = Math.max(max[0],  root.val+leftMax+rightMax);
        return root.val+Math.max(leftMax,rightMax);
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5516070.html