二叉树的最大路径和
给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。这个路径的开始节点和结束节点可以是二叉树中的任意节点。例如:给出以下的二叉树,
返回的结果为6。
private int res = Integer.MIN_VALUE;
public int maxPathSum (TreeNode root) {
// write code here
if (root == null){
return 0;
}
if (root.left == null && root.right == null){
return root.val;
}
findPathSum(root);
return res;
}
//函数的返回值定义为以自己为根的一条从根到子结点的最长路径
//这个返回值是为了提供给它的父结点计算自身的最长路径用,这样一来,一个结点自身的最长路径就是它的左子树返回值(如果大于0的话),
//加上右子树的返回值(如果大于0的话),再加上自己的值。
//因为返回值只取一支路径的和,所以findPathSum返回值则是自己的值或者自己的值加上左子树返回值或者自己的值加上右子树返回值
private int findPathSum(TreeNode root){
if (root == null){
return 0;
}
int sum = root.val;
int leftSum = findPathSum(root.left);
int rightSum = findPathSum(root.right);
if (leftSum > 0)
sum += leftSum;
if (rightSum > 0){
sum += rightSum;
}
res = Math.max(res,sum);
return Math.max(root.val,Math.max(rightSum,leftSum)+root.val);
}