问题:
难度:easy
说明:
输入一个二叉树根节点,求出二叉树里面最大的连续路径和,路径不带分叉的,不需要一定返回包含根节点的和。
输入范围:
root不为空。
输入案例:
Example 1:
Input: [1,2,3]
1
/ \
2 3
Output: 6
Example 2:
// 20 + 15 + 7最大
Input: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
Output: 42
我的代码:
以前已经做过了一个二叉树问题,Diameter of Binary Tree,求二叉树直径,就是把每个节点和left、right的sum都进行统计,本题的话,因为路径不带分叉,所以计算完root+left+right和root + left / root + right / root,不返回root+left+right是否最大值,然后比较得出最大值返回就可以了。使用递归,也可以用arraylist进行存储,然后拿出来遍历比较,我写的不假思索的。
class Solution {
// max
int m = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
recurtion(root);
return m;
}
public int recurtion(TreeNode root) {
// left sum
int ls = 0;
// right sum
int rs = 0;
if(root.left != null) ls = recurtion(root.left);
if(root.right != null) rs = recurtion(root.right);
// sum
int r = root.val;
int s = r + ls + rs;
int sl = ls + r;
int sr = rs + r;
int mm = r;
// 要返回一个最大的mm
if(mm < sl) mm = sl;
if(mm < sr) mm = sr;
// 要注意,路径返回和求出连续路径最大值,要考虑本节点root + left + right
if(m < s) m = s;
if(m < sl) m = sl;
if(m < sr) m = sr;
if(m < r) m = r;
return mm;
}
}
简化一下:
class Solution {
// max
int m = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
recurtion(root);
return m;
}
public int recurtion(TreeNode root) {
// left sum
int ls = 0;
// right sum
int rs = 0;
if(root.left != null) ls = recurtion(root.left);
if(root.right != null) rs = recurtion(root.right);
// sum
int r = root.val;
// 要返回一个最大的mm
int mm = Math.max(ls + r,Math.max(rs + r, r));
// 最大值
m = Math.max(Math.max(m,mm),ls + rs + r);
return mm;
}
}