【LeetCode】Day85-二叉树中的最大路径和

这篇博客介绍了如何解决二叉树中的最大路径和问题,难点在于自底向上的递归策略。通过计算左子树和右子树的最大路径和,并结合根节点值,确定子树内部的最大路径。最终通过动态维护全局最大路径和来找到整个树中的最大路径。算法的时间复杂度和空间复杂度均为O(n),适合处理树的困难题目。
摘要由CSDN通过智能技术生成

题目

124. 二叉树中的最大路径和【困难】

题解

这里的路径和一般理解的路径不太一样,它是从任意结点开始的,不一定包含根结点

如果我们自顶向下寻找最大路径和,会出现路径重叠的问题,因此考虑自底向上的递归解决

对于如下图所示的三个结点,采用自底向上方式,路径可能为:b+c+a,b+a,c+a三种,总之一定会经过根节点a,于是可以得出一个子树内部的最大路径和 = 左子树提供的最大路径和 + 根节点值 + 右子树提供的最大路径和,即dfs(root.left)+root.val+dfs(root.right)
在这里插入图片描述

class Solution {
    int max=Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root){
        dfs(root);
        return max;
    }
    public int dfs(TreeNode root) {
        if(root==null)
            return 0;
        int leftVal=Math.max(0,dfs(root.left));//左子树路径最大值,大于0时才会选择该结点
        int rightVal=Math.max(0,dfs(root.right));//右子树路径最大值
        int lmr=root.val+leftVal+rightVal;//左根右的路径值
        
        max=Math.max(max,lmr);//更新全局最大路径和
        return root.val+Math.max(leftVal,rightVal);//由于要往上返,所以不能同时占着左右子,要选个最大的
    }
}

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

树的困难题,有动态规划的意思,难的是思路,代码倒是不多…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值