JAVA,这道题读懂题目远比做出题困难

binary-tree-maximum-path-sum

http://www.nowcoder.com/questionTerminal/da785ea0f64b442488c125b441a4ba4a

不知道是不是有的小伙伴一开始和我一样,题目都不是很理解。先上代码,后面我跟大家详细的分享一下我的思路。

class Solution {
    public int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        getMax(root);
        return res;
    }

    public int getMax(TreeNode root){
        if(root == null) return 0;
        int leftMax = Math.max(0,getMax(root.left));
        int rightMax = Math.max(0,getMax(root.right));
        //*1.--下面一行划重点--//
        res = Math.max(res,Math.max(root.val+Math.max(leftMax,rightMax),root.val+leftMax+rightMax));
        //*2--这一行也很重要--//
        return Math.max(leftMax,rightMax) + root.val;
    }
}

想法的基础就是dfs,深度遍历,根据题意我们要想清楚两件事情
1.节点可能是非负的,因词开始dfs的节点不一定是根节点,结束的节点也不一定是叶子结点
2.题目没有说一定要按照自顶向下的顺序遍历,也就是说还有一种情况是这样 root.left->root->root.right。这就需要我们找到左子树最大值,右子树最大值加上根。这样一个值。
最后就是比较这两种情况哪个更大,也就是代码中标记的1这一行。
*2这一行如果大家没有深入理解的话可能也会有一些疑惑,为什么返回的是Math.max(leftMax,rightMax) + root.val,而不是root.val+leftMax+rightMax。这个其实也需要大家好好的思考一下,我们这个函数getMax()的作用,只是找到root节点下的最大节点和!这点一定要搞清楚。不要被这一行代码
1迷惑住,这只是我们更新res的代码。2是dfs找最大值的方式,1适用于这道题。
如果大家还有疑惑,可以尝试自底向上的想法递推一下。应该问题就会想的更明白了。

全部评论
思考了一下,发现你的1可以精简为: res= Math.max(result,root.val+leftMax+rightMax); 因为leftMax和rightMax是非负的,所以root.val+leftMax+rightMax一定大于等于root.val+Math.max(leftMax+rightMax)
3 回复 分享
发布于 2021-01-05 20:55
题目有问题
1 回复 分享
发布于 2021-05-29 09:43
可以很到位,root.val+leftMax+rightMax这个地方很容易错,因为这样无法和上一层的父节点构成路径
点赞 回复 分享
发布于 2023-07-18 09:20 河南
这道题目确实没说清楚条件……
点赞 回复 分享
发布于 2021-07-28 10:03
题目读起来真拗口
点赞 回复 分享
发布于 2020-11-08 09:34
重点不在dfs,在于读懂题目意思,很强
点赞 回复 分享
发布于 2020-09-04 11:54
给你点个赞
点赞 回复 分享
发布于 2020-09-04 11:54
当然,*1是可以简化的。我po出这种写法是觉得这种大家看得也会更清楚一些。
点赞 回复 分享
发布于 2020-03-20 12:44

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
谁知道呢_:要掉小珍珠了,库库学三年,这个结果
点赞 评论 收藏
分享
评论
36
8
分享

创作者周榜

更多
牛客网
牛客企业服务