leetcode124——二叉树中的最大路径和——java实现

本文深入探讨了在二叉树中寻找最大路径和的算法实现,通过对递归方法的逐步分析,介绍了如何计算从根节点到叶节点的最大路径和,并进一步扩展到任意子节点的最大路径和。文章提供了详细的代码示例,包括避免重复递归的优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:
在这里插入图片描述
分析:
感谢一位神仙的分享,看后犹如醍醐灌顶!戳:力扣(LeetCode)124
我大致理一下:

  1. 之前我们做过一道求二叉树的深度的题目,求法为(这里方法名为depth):
    return Math.max(depth(root.left), depth(root.right)) + 1;

  2. 扩展一下可求二叉树根节点到叶节点的最大路径和,求法为(这里方法名为maxSum):
    return Math.max(maxSum(root.left), maxSum(root.right)) + root.val;

  3. 再扩展一下,渴求二叉树根节点到其子节点的最大路径长度,上述链接作者将它称之为”根向下最大延伸“,非常形象。意思就是它并不是要求到叶节点,而是求到哪里和最大,就在那个子节点就停止了。求法为:

     int temp = Math.max(dfs(root.left), dfs(root.right));
     if(temp > 0)
     	return temp + root.val;
     else
     	return root.val;
    
  4. 既然求出了“根向下最大延伸”,那么就可以求本题的解了。路径和有四种情况:root.val,dfs(root.left)+root.val,dfs(root.right)+root.val,dfs(root.left)+dfs(root.right)+root.val,只需要对dfs(root.left)和dfs(root.right)是否大于0进行判断即可。

具体代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int ans = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        if(root == null)
            return 0;
        dfs(root);
        return ans;      
    }
    private int dfs(TreeNode root) {
        if(root == null)
            return 0;
        int temp = Math.max(dfs(root.left), dfs(root.right));
        if(temp > 0) {
            temp += root.val;
        } else {
            temp = root.val;
        }
        int val = root.val;
        if(dfs(root.left) >= 0)
            val += dfs(root.left);
        if(dfs(root.right) >= 0)
            val += dfs(root.right);
        ans = Math.max(ans,val);
        return temp;
    }
}

上述代码在执行的时候结果正确,但是在提交的时候会超出时间限制,原因是因为递归的次数实在是太多了。我看了一下链接中那位作者,人家用了一个变量left代表dfs(root.left),用right代表dfs(root.right),完美规避多次重复递归问题。
所以AC代码如下:

class Solution {
    int ans = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        if(root == null)
            return 0;
        dfs(root);
        return ans;     
    }  
    
    private int dfs(TreeNode root) {
        if(root == null)
            return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        int temp = Math.max(left,right);
        if(temp > 0)
            temp += root.val;
        else
            temp = root.val;
        
        int val = root.val;
        if(left >= 0)
            val += left;
        if(right >= 0)
            val += right;
        
        ans = Math.max(ans,val);
        return temp;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值