# 20150708 lintcode 总结 Binary Tree Maximum Path Sum Show result *****

#### Medium Binary Tree Maximum Path Sum

23%
Accepted

Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree.

Example: Given the below binary tree:

  1
/ \
2   3


return 6.

/**
* Definition of TreeNode:
* public class TreeNode {
*     public int val;
*     public TreeNode left, right;
*     public TreeNode(int val) {
*         this.val = val;
*         this.left = this.right = null;
*     }
* }
*/
public class Solution {

private class ResType{
private int singlePath, maxPath;
public ResType(int singlePath, int maxPath){
this.singlePath = singlePath;
this.maxPath = maxPath;
}
};

private ResType helper(TreeNode root){
if(root == null){
return new ResType(0, Integer.MIN_VALUE);
}
// divide
ResType left = helper(root.left);
ResType right = helper(root.right);
//conquer
int singlePath = Math.max(left.singlePath, right.singlePath)+root.val;
singlePath = Math.max(singlePath, 0);         //very important !!!

int maxPath = Math.max(left.maxPath, right.maxPath);
maxPath = Math.max(maxPath, left.singlePath+right.singlePath+root.val);

return new ResType(singlePath, maxPath);
}

/**
* @param root: The root of binary tree.
* @return: An integer.
*/
public int maxPathSum(TreeNode root) {
ResType res = helper(root);
return res.maxPath;
}
}


1. singlePath是从root到左子树或右子树任一node的 最大path sum， 如果singlePath是负数， 就强制设其为0，等于parent计算时不再考虑此root为根的tree的singlePath。

2. maxPath是root 树中最大的 path sum，可以不经过 root。

1.  经过 root： left.singlePath + root.val + right.singlePath

2. 不经过 root:  Math.max(left.maxPath, right.maxPath);

08-02 1394

12-27 2249

04-05 1.5万

01-22 3609

02-06 1.1万

09-02 1619

06-16 1425

12-30 1996

04-14 1.3万

03-07 777