给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3] 1 / \ 2 3 输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7] -10 / \ 9 20 / \ 15 7 输出: 42
/*
* 这道题的遍历顺序应该是post-order(左右根) 自下向上的记录最大路径和
* helper 返回包含此节点和此节点的一个叉的最大值。
* 1
* / \
* 2 3
* / \ / \
* 4 5 6 7
* 实际上是遍历所有根节点的路径,记录最大的值
* 例如: 根节点2: 4 5 2
* 根节点3: 6 7 3
* 根节点1: 2 5 7 3 1 (这时左右子树不可能全要,只能要一个叉,左边是2-5, 右边是3-7,需要一个函数返回这个值)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int sum=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if(root==null)
return 0;
getMaxPathSum(root);
return sum;
}
//求以root为节点的最大的路径和(包含root节点)
private int getMaxPathSum(TreeNode root) {
if(root==null)
return 0;
int leftmax=Math.max(0,getMaxPathSum(root.left));
int rightmax=Math.max(0,getMaxPathSum(root.right));
sum=Math.max(sum,leftmax+root.val+rightmax);
return root.val+Math.max(leftmax,rightmax);
}
}