题目要求:
分析:
感谢一位神仙的分享,看后犹如醍醐灌顶!戳:力扣(LeetCode)124
我大致理一下:
-
之前我们做过一道求二叉树的深度的题目,求法为(这里方法名为depth):
return Math.max(depth(root.left), depth(root.right)) + 1; -
扩展一下可求二叉树根节点到叶节点的最大路径和,求法为(这里方法名为maxSum):
return Math.max(maxSum(root.left), maxSum(root.right)) + root.val; -
再扩展一下,渴求二叉树根节点到其子节点的最大路径长度,上述链接作者将它称之为”根向下最大延伸“,非常形象。意思就是它并不是要求到叶节点,而是求到哪里和最大,就在那个子节点就停止了。求法为:
int temp = Math.max(dfs(root.left), dfs(root.right)); if(temp > 0) return temp + root.val; else return root.val;
-
既然求出了“根向下最大延伸”,那么就可以求本题的解了。路径和有四种情况:root.val,dfs(root.left)+root.val,dfs(root.right)+root.val,dfs(root.left)+dfs(root.right)+root.val,只需要对dfs(root.left)和dfs(root.right)是否大于0进行判断即可。
具体代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int ans = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if(root == null)
return 0;
dfs(root);
return ans;
}
private int dfs(TreeNode root) {
if(root == null)
return 0;
int temp = Math.max(dfs(root.left), dfs(root.right));
if(temp > 0) {
temp += root.val;
} else {
temp = root.val;
}
int val = root.val;
if(dfs(root.left) >= 0)
val += dfs(root.left);
if(dfs(root.right) >= 0)
val += dfs(root.right);
ans = Math.max(ans,val);
return temp;
}
}
上述代码在执行的时候结果正确,但是在提交的时候会超出时间限制,原因是因为递归的次数实在是太多了。我看了一下链接中那位作者,人家用了一个变量left代表dfs(root.left),用right代表dfs(root.right),完美规避多次重复递归问题。
所以AC代码如下:
class Solution {
int ans = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if(root == null)
return 0;
dfs(root);
return ans;
}
private int dfs(TreeNode root) {
if(root == null)
return 0;
int left = dfs(root.left);
int right = dfs(root.right);
int temp = Math.max(left,right);
if(temp > 0)
temp += root.val;
else
temp = root.val;
int val = root.val;
if(left >= 0)
val += left;
if(right >= 0)
val += right;
ans = Math.max(ans,val);
return temp;
}
}