LeetCode124.二叉树中的最大路径和(Java)

传送门
https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/

题目描述

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

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

在这里插入图片描述

题目分析

路径定义与平时用的有区别。本题中:树任意两点间的距离
节点值可能为负,若为负,不计入路径长度中

递归法

通过子节点的值逐渐累加,得到路径值,所以用树的后序遍历。

void travel(p){
	if(p!=null){
	travel(p->left);
	travel(p->right);
	visit(p)	
	}
}

本题中,递归函数——每个节点在路径中的值

  • 空节点,值为0
  • 非空节点,值为节点本身+ max(left,right)

同时,设置一个全局变量,表示当前树中最大路径长度Length
Length为每次递归时,Lengthmax(Length , p->val+left+right)

例如
在这里插入图片描述
叶子节点:9,15,7
20节点,贡献值为20+15=35,此时路径长度为15+7+20=42,节点15到节点7
-10节点,贡献值为负,放弃该点
因此,这棵树中的最大路径和为42

import java.util.*;
class Solution {
/*  节点值可能为负,不计算负节点的值
    本题路径:二叉树任意两个节点之间的路径
    仿照二叉树后序遍历过程
    递归/非递归
*/

    //递归
    int Length = Integer.MIN_VALUE; //全局变量,存储路径长度最大值
    public int maxPathSum(TreeNode root) {
        result(root);
        return Length;
    }

    public int result(TreeNode p){
        if(p==null){
            return 0;
        }
        
        //当前节点左/右孩子路径和,若为负,则弃
        int left = Math.max(result(p.left),0);
        int right = Math.max(result(p.right),0);

        //比较加入当前节点后的路径和,与此时路径长度最大值
        int res = left + right + p.val;
        Length = Math.max(Length,res);

        return p.val+Math.max(left,right);

    }
}

复杂度分析
时间复杂度:O(N),其中 N是二叉树中的节点个数。对每个节点访问不超过 2 次。
空间复杂度:O(N),其中 N是二叉树中的节点个数。空间复杂度主要取决于递归调用层数,最大层数等于二叉树的高度,最坏情况下,二叉树的高度等于二叉树中的节点个数。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值