这道题貌似有点贪心的味道。还有就是同样的逻辑,人家的就写的简单明了,我写的就复杂了呢。
题目如下:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
我的解决办法:
package test;
public class LC124Try1
{
public int maxPathSum(TreeNode root)
{
int[] dp=new int[1];
dp[0]=root.val;
getPass(root,dp);
return dp[0];
}
public int getPass(TreeNode root,int[] dp){
int max=Integer.MIN_VALUE;
if(root==null){
return max;
}
int val=root.val;
int temp=root.val;
int maxleft=getPass(root.left,dp);
int maxright=getPass(root.right,dp);
int maxtemp=Math.max(maxleft, maxright);
if(maxleft>0){
temp+=maxleft;
}
if(maxright>0){
temp+=maxright;
}
max=Math.max(maxtemp,temp);
if(max>dp[0]){
dp[0]=max;
}
if(maxtemp<0){
return val;
}else{
return val+maxtemp;
}
}
}
class Solution {
int maxSum=-1000;
public int maxPathSum(TreeNode root) {
passNodeSum(root);
return maxSum;
}
public int passNodeSum(TreeNode p){//经过这个节点的路径最大值
if(p.right==null && p.left==null){
if(p.val>maxSum){
maxSum=p.val;
}
return p.val;
}
int leftSum=-1000;
int rightSum=-1000;
if(p.left!=null){
leftSum=passNodeSum(p.left);
}
if(p.right!=null){
rightSum=passNodeSum(p.right);
}
int pSum=Math.max(Math.max(leftSum,rightSum)+p.val,p.val);
if(pSum>maxSum ||leftSum+rightSum+p.val>maxSum ){
maxSum=Math.max(pSum,leftSum+rightSum+p.val);
}
return pSum;
}
}
第二种解决办法:别人的就是那么的清晰
package test;
public class LC124Try2
{
static int maxValue = 0;
public int maxPathSum(TreeNode root)
{
maxValue = Integer.MIN_VALUE;
if (root == null)
{
return 0;
}
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;
}
}
哈哈