二叉树的最大路径和(困难)
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。里面的节点的值可能为负。链接-leetcode124
如下图:
思路:有一些类似的题目,比如从一个二叉树里面的任意一个节点出发,只能往下,然后求最大的路径和或者是最大的异或和,这道题不同的地方在于,它既可以网上,也可以往下。另外,也有类似的题目是求一个二叉树里面的最长路径,而不是最大路径和。
这里我们假设一下,如果我们知道了每个节点往下的最大路径和(注意,往下不一定非要到达叶子节点,可以在往下的任意位置停下),那么整个二叉树的最大路径和其实就是:**在后序遍历二叉树的过程中,每个节点的值+左子树往下的最大路径+右子树往下的最大路径 **,我们只需要在遍历的过程中维护一个最大值max即可。
而这个递归函数需要返回每个头结点往下的最大路径和即可。
public int max=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root)
{
if(root==null)
return 0;
process(root);
return max;
}
//到从node往下的最大路径和,不一定要到达叶子节点
public int process(TreeNode node){
if(node==null)
return 0;
int left=Math.max(0,process(node.left));
int right=Math.max(0,process(node.right));
int itselt=node.val+left+right;
max=Math.max(max,itselt);
return node.val+Math.max(left,right);
}