Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1 / \ 2 3
Return 6
.
这道题的意思是从一棵树中找出从任何一个节点到任何一个节点的路径之和的最大值max。
比如这样一棵树,要求最后返回max = 9。
任意两个节点之间的路径一定是会经过其父节点的。比如算-2和4的路径,那么一定是经过-1的。
由于节点的权值可能为负数,所以一个节点node的最大值不只是由node.val + maxleft、node.val + maxright影响,还由node.val影响。比如4这个节点,如何得出这个节点的最大值为4的,一个是用 4 + (-3) 也就是所有通过4的左子树的路径,一个是用4 + 0也就是所有通过4的右子树的路径,还有一个就是4本身也就是以4为路径的一个端点,这三种情况里显然是只有localmax =4这种情况会是局部的最优结果。
所以递归的重点就是传递max(node.val, node.val + maxleft, node.val + maxright)的值。(maxleft、maxright就是子节点的这三个的max值)
而这道题求的是最大的那条路径,即全局globalmax。 由于某个节点到某个节点的路径一定会经过其父节点,所以我们只需要计算出该树的每个节点上的maxleft、maxright和node.val的最大和(即该node的tempmax = node.val + maxleft >0? maxleft : 0 + maxright > 0? maxright : 0)。找所有节点中tempmax最大的那个值返回即可。
Source
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
int max = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if(root == null) return 0;
dfs(root);
return max;
}
public int dfs(TreeNode root){
if(root == null)
return 0;
int temp = root.val;
int maxl = 0, maxr = 0; //设为Integer.Max或Min会存在着加减溢出的问题 凡是涉及到加减乘除运算的初始值一定要注意
if(root.left != null){
maxl = dfs(root.left);
if(maxl > 0) temp = temp + maxl;
}
if(root.right != null){
maxr = dfs(root.right);
if(maxr > 0) temp = temp + maxr;
}
if(temp > max)
max = temp;
int curmax = Math.max(root.val, Math.max(root.val + maxl, root.val + maxr));
return curmax;
}
}
Test
public static void main(String[] args){
TreeNode a = new TreeNode(-1);
a.left = new TreeNode(-2);
a.right = new TreeNode(5);
a.right.left = new TreeNode(4);
a.right.left.left = new TreeNode(-3);
int res = new Solution().maxPathSum(a);
System.out.println(res);
}