Binary Tree Maximum Path Sum (Java)

25 篇文章 0 订阅
21 篇文章 0 订阅

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.

这道题的意思是从一棵树中找出从任何一个节点到任何一个节点的路径之和的最大值max。


比如这样一棵树,要求最后返回max = 9。

任意两个节点之间的路径一定是会经过其父节点的。比如算-2和4的路径,那么一定是经过-1的。

由于节点的权值可能为负数,所以一个节点node的最大值不只是由node.val + maxleft、node.val + maxright影响,还由node.val影响。比如4这个节点,如何得出这个节点的最大值为4的,一个是用 4 + (-3) 也就是所有通过4的左子树的路径,一个是用4 + 0也就是所有通过4的右子树的路径,还有一个就是4本身也就是以4为路径的一个端点,这三种情况里显然是只有localmax =4这种情况会是局部的最优结果。

所以递归的重点就是传递max(node.val, node.val + maxleft, node.val + maxright)的值。(maxleft、maxright就是子节点的这三个的max值)

而这道题求的是最大的那条路径,即全局globalmax。 由于某个节点到某个节点的路径一定会经过其父节点,所以我们只需要计算出该树的每个节点上的maxleft、maxright和node.val的最大和(即该node的tempmax = node.val + maxleft >0? maxleft : 0 + maxright > 0? maxright : 0)。找所有节点中tempmax最大的那个值返回即可。 

Source

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
	int max = Integer.MIN_VALUE;
	
    public int maxPathSum(TreeNode root) {
        if(root == null) return 0;
        
        dfs(root);
        return max;
    }
    
    public int dfs(TreeNode root){
    	if(root == null)
    		return 0;
    	
    	int temp = root.val;
    	int maxl = 0, maxr = 0;   //设为Integer.Max或Min会存在着加减溢出的问题 凡是涉及到加减乘除运算的初始值一定要注意
    	if(root.left != null){
    		maxl = dfs(root.left);
    		if(maxl > 0) temp = temp + maxl;
    	}
    	if(root.right != null){
    		maxr = dfs(root.right);
    		if(maxr > 0) temp = temp + maxr;
    	}
    	
    	if(temp > max)
    		max = temp;
    	int curmax = Math.max(root.val, Math.max(root.val + maxl, root.val + maxr));
    	return curmax;
    }
}


Test

    public static void main(String[] args){
    	TreeNode a = new TreeNode(-1);
    	a.left = new TreeNode(-2);
    	a.right = new TreeNode(5);
    	a.right.left = new TreeNode(4);
    	a.right.left.left = new TreeNode(-3);
    	
    	int res = new Solution().maxPathSum(a);
    	System.out.println(res);
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值