zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    高速排序(递归与分治的思想)
    silverlight wcf mvvm
    黑龙江绿色食品青年电商销售大赛开幕,绿色巨人最终发力做电商了
    ecnu 1244
    可穿戴KEY带来的身份认证的革命
    深入理解7816(3)-----关于T=0 【转】
    深入理解7816(1)---- 关于F/D和etu【转】
    深入理解7816(2)---关于ATR【转】
    [Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程
    Ubuntu16.04下搭建开发环境及编译tiny4412 Android系统【转】
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5516070.html
Copyright © 2011-2022 走看看