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
当然,*1是可以简化的。我po出这种写法是觉得这种大家看得也会更清楚一些。
点赞 回复 分享
发布于 2020-03-20 12:44
给你点个赞
点赞 回复 分享
发布于 2020-09-04 11:54
重点不在dfs,在于读懂题目意思,很强
点赞 回复 分享
发布于 2020-09-04 11:54
题目读起来真拗口
点赞 回复 分享
发布于 2020-11-08 09:34
这道题目确实没说清楚条件……
点赞 回复 分享
发布于 2021-07-28 10:03
可以很到位,root.val+leftMax+rightMax这个地方很容易错,因为这样无法和上一层的父节点构成路径
点赞 回复 分享
发布于 2023-07-18 09:20 河南

相关推荐

10-15 15:00
潍坊学院 golang
跨考小白:这又不是官方
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
35 8 评论
分享
牛客网
牛客企业服务