题目:给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。
这个路径的开始节点和结束节点可以是二叉树中的任意节点
例如:
给出以下的二叉树,
返回的结果为6(2+1+3)
太强了太强了,大佬就是大佬。。。。自己写了半天,代码一行又一行也没啥结果,人家几行就解决了。。。
直接看递归函数,我在处理的时候一直有个问题就是,在计算过程中进行累加 sum ,然后动态的去更新 max 的值,但是初始化的时候,不知道该怎么初始化 sum,如果初始化 0 ,当树中结点都为负数的时候,答案肯定不对,如果初始化为 root 的值,那么处理起来又很麻烦,而且在处理的过程中,针对 sum 的正负取值和 max 的正负取值,都会有不同的处理。。。这样处理确实是有问题,因为题目其实是将二叉树作为无向图处理的,使用传统的遍历的返回值的话,还是只能进行单向遍历。
这里是将最终的累加和定义为一个全局变量,这样就用作为函数的参数传入了,然后在处理的时候动态进行更新。
这里说一下思路,解法将整个路径分成了三段,当前节点,左边部分,右边部分,三部分加起来构成了最长的路径,用于动态更新 max ,然后函数的返回值这里只需要返回加上当前节点所能构成的最大长度的路径分支,用于父节点的更新计算路径。
(ps:感觉还没有完全理解,后面再看看)
完整代码如下:
public class Solution {
int maxValue;
public int maxPathSum(TreeNode root) {
maxValue = Integer.MIN_VALUE;
maxPathDown(root);
return maxValue;
}
private int maxPathDown(TreeNode node){
if(node==null)
return 0;
int left = Math.max(0, maxPathDown(node.left));
int right = Math.max(0, maxPathDown(node.right));
maxValue = Math.max(maxValue, left + right + node.val);
return Math.max(left, right) + node.val;
}
}