很有难度的一道题,主要是最大和的可能性很多,不知道如何分情况。
关键点1:
分析:http://fisherlei.blogspot.com/2013/01/leetcode-binary-tree-maximum-path-sum.html
For each node like following, there should be four ways existing for max path:
1. Node only (因为本题中的节点可能是负值!)
2. L-sub + Node
3. R-sub + Node
4. L-sub + Node + R-sub
Keep trace the four path and pick up the max one in the end.
关键点2:明确递归函数的返回值是什么:这本题中返回值表示通过root节点能走到root的parent的最大和,这个值作为返回对象返给调用父函数
因为在Java中无法像C++一样引用传值或者利用指针传值,以前的解决办法是用全局变量。
今天找到更好的办法,就是利用数组传值!
package Level4;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction;
import Utility.TreeNode;
/**
* Binary Tree Maximum Path Sum
*
* 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.
*
*/
public class S124 {
public static void main(String[] args) {
TreeNode root = new TreeNode(0);
System.out.println(maxPathSum(root));
}
public static int maxPathSum(TreeNode root) {
int[] max = {Integer.MIN_VALUE}; // 因为Java里都是pass by value所以利用数组传!
rec(root, max);
return max[0];
}
public static int rec(TreeNode root, int[] max){
if(root == null){
return 0;
}
int leftSubtreeMaxSum = rec(root.left, max); // 左子树的最大和
int rightSubtreeMaxSum = rec(root.right, max); // 右子树的最大和
int arch = leftSubtreeMaxSum + root.val + rightSubtreeMaxSum; // 从左子树经过root到右子树的最大和
// 表示通过root节点能走到root的parent的最大和,这个值作为返回对象返给调用父函数
// 只有3中情况: 1 从左子树到root再到parent
// 2 从右子树到root再到parent
// 3 直接从root到parent
// 注意arch那条路是不可能走到parent,因为那条路已经经过root了,除非折回来重复走!但这是不允许的
int maxPathAcrossRootToParent = Math.max(root.val, Math.max(leftSubtreeMaxSum, rightSubtreeMaxSum)+root.val);
// max[0] 保存在所有递归过程中的最大值,这时也要考虑arch可能最大
max[0] = Math.max(max[0], Math.max(arch, maxPathAcrossRootToParent));
return maxPathAcrossRootToParent;
}
}