zoukankan      html  css  js  c++  java
  • 124. Binary Tree Maximum Path Sum

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        int maxValue=Integer.MIN_VALUE;
        public int maxPathSum(TreeNode root) {
            int r=postOrder(root);
            return Math.max(maxValue,r);
        }
        
        int postOrder(TreeNode root)
        {
            if(null==root)return Integer.MIN_VALUE;
            int left=postOrder(root.left);
            int right=postOrder(root.right);
            maxValue=Math.max(maxValue,root.val);
            int result=root.val;
            if(root.left!=null)
            {
                maxValue=Math.max(maxValue,left);
                result=Math.max(result,left+root.val);
            }
            
            if(root.right!=null)
            {
                maxValue=Math.max(maxValue,right);
                result=Math.max(result,root.val+right);
            }
            
            if(root.left!=null&&root.right!=null)
            {
                maxValue=Math.max(maxValue,left+root.val+right);
            }
            return result;
        }
    }
    Details 
    Runtime: 1 ms, faster than 99.70% of Java online submissions for Binary Tree Maximum Path Sum.
    Memory Usage: 39.5 MB, less than 94.25% of Java online submissions for Binary Tree Maximum Path Sum.

    完全没看答案可算accept了, 事后看了眼答案, 果然厉害,不需要任何if判断.

    https://leetcode.com/problems/binary-tree-maximum-path-sum/discuss/39775/Accepted-short-solution-in-Java

    先记录我这个"辣鸡"版本的思路, 这个求二叉树的最长路径和, 最开始只想到暴力搜索.. 然后想到有个类似题 Binary Tree Tilt , 于是就做了.

    思路完全是一样的, tilt是求绝对值, 这个是求和....就没搞懂怎么就一个是easy 一个是hard了....

    当然这题的麻烦之处在于怎么处理null节点, 也就是边界问题.

    按照标准答案对比了我的答案. 修改如下

    class Solution {
        int maxValue=Integer.MIN_VALUE;
        public int maxPathSum(TreeNode root) {
            postOrder(root);
            return maxValue;
        }
        
        int postOrder(TreeNode root)
        {
            if(null==root)return 0;
            int left=Math.max(0,postOrder(root.left));
            int right=Math.max(0,postOrder(root.right));
            //maxValue=Math.max(maxValue,root.val); 
            //maxValue=Math.max(maxValue,left);
            //maxValue=Math.max(maxValue,right);
            maxValue=Math.max(maxValue,left+root.val+right);
        
            return Math.max(left,right)+root.val;
        }
    }

    if判断全部去掉.  当null==root时,必须返回一个值,用什么好呢,如果用MIN_VALUE, 则会出现两个MIN_VALUE相加而溢出...恶心.!

    这里用了0, 并且同时用Math.max(0,postOrderxxx) 来防止全是负数的情况, 不然0就比负数大了.

    中间三个判断全部不需要(注释部分),我们来想一下为什么, 假如中间三个任意一个成立, 那么第四个语句一定成立,因为他就是把三个值全加起来.  所以中间三句属于重复判断,没有意义

    中间三个不可能出现全不成立的情况.  left/right/root  一共就这三部分,总会有个最大的.

  • 相关阅读:
    大话设计模式Python实现-代理模式
    大话设计模式Python实现-装饰模式
    大话设计模式Python实现-策略模式
    设计模式Python实现-简单工厂模式
    Python文件读写机制
    python 多线程剖析
    I/O多路复用-EPOLL探索
    Python学习笔记:魔术方法详解
    Django学习笔记:为Model添加Action
    【Django】Django Debug Toolbar调试工具配置
  • 原文地址:https://www.cnblogs.com/lychnis/p/10865394.html
Copyright © 2011-2022 走看看