解题思路
124. 二叉树中的最大路径和
最大路径和S:
提供给父节点的最大路径值V:
解决该题的关键在于搞清楚SB和VB的区别和联系。
其中S^B = B+max(V^D ,0)+max(V^E,0) , 而V^B = B+max(max(V^D ,0),max(V^E,0)),这二者之间的区别在于:
S^B:B的最大路径和 = B的值+D所能提供的最大路径值+E所能提供的最大路径值。
V^B:B所能提供给其父节点A的最大路径值=B的值+D和E中所能提供给B的最大路径值的更大的值。
格式中反复用到max函数将所能提供给父节点的最大路径值与0做比较,是因为如果其小于0,那么加进去路径值反而会变小,所有不加(即加0)。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//运行时间:1ms , 内存消耗:40.2MB
private int sum = Integer.MIN_VALUE; //要使sum的初始值足够小,保证第28行语句执行后sum的值会变化
public int maxPathSum(TreeNode root) {
value(root);
return sum;
}
//计算node提供给父节点的最大路径值
public int value(TreeNode node){
if(node == null) return 0;
int left_value = Math.max(value(node.left),0); //node左节点可以提供的最大路径值,若为负数,则不加
int right_value = Math.max(value(node.right),0);//node左节点可以提供的最大路径值
//节点的最大路径和,留下所有节点中最大的路径和
sum = Math.max(node.val+left_value+right_value,sum);
return node.val+Math.max(left_value,right_value);
}
}