Leetcode 124 Binary Tree Maximum Path Sum 二叉树中的最大路径和,这道题的思路我觉得是基于53题的基础上的

这道题貌似有点贪心的味道。还有就是同样的逻辑,人家的就写的简单明了,我写的就复杂了呢。

题目如下:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 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;
	}

}

哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值