LeetCode 28 Binary Tree Maximum Path Sum

本文介绍了一种解决二叉树中寻找最大路径和问题的算法实现。通过对树进行遍历并计算每个节点的最大路径和,最终找到整棵树的最大路径和。文章详细解释了递归函数的设计思想和具体实现。

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

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.

分析:

刚看到题,以为是图算法,找最大路径和。但考虑到树是有向图,没有办法直接从子节点遍历到父节点。

但对于任意一个节点,都可以计算以此节点开始(即此节点是路径的一端)往下遍历的最大路径和。

有了上面的认识,

对于某一个节点,我们就可以用 左孩子的路径,右孩子的路径 以及当前节点组合成任意两点间的路径(此路径经过当前节点)。

既然,任意两点的路径可以如此构造,那么任意两点间路径和也可以求出。

思路清晰了之后,

我么对树进行遍历,并求出经过每个节点的最大路径和,进行比较即可。

几个注意点

1,递归访问时,函数返回的应该是以当前节点开始往下的最大路径和;

2,Java中参数是值传递,所以max要是一个引用变量,最简单的就是数组咯,声明为只有一个元素的数组即可。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public int maxPathSum(TreeNode root) {
        //max用来记录最大路径和
        int[] max = new int[1];
        max[0] = Integer.MIN_VALUE;
        calSum(root, max);
        return max[0];
    }
    //此函数返回node开始往下的最大路径和
    public int calSum(TreeNode node, int[] max){
        if(node == null)
            return 0;
        
        int left = calSum(node.left, max);
        int right = calSum(node.right, max);
        //根据左右孩子的情况计算当前节点开始往下的最大路径和
        int current = Math.max(node.val, Math.max(node.val+left, node.val+right));
        //更新max
        max[0] = Math.max(max[0], Math.max(current, left+node.val+right));
        
        return current;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值