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适用于这道题。
如果大家还有疑惑,可以尝试自底向上的想法递推一下。应该问题就会想的更明白了。