1. 题目
https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/
路径是指从树中任意节点出发,到达任意节点的序列,不一定经过根节点。路径和是指路径上所有节点的值的和。要求返回任意非空二叉树的最大路径和。
考察点
这道题的考察点主要有以下几个:
- 二叉树的遍历:需要使用深度优先搜索(DFS)或者分治法来遍历二叉树的每个节点,找出最大路径和。
- 递归函数的设计:需要设计一个递归函数,返回每个节点的最大贡献值,即该节点和其子树能为上层节点提供的最大路径和。同时,需要更新一个全局变量,记录当前的最大路径和。
- 路径和的计算:需要考虑路径是否经过根节点,以及路径是否包含负数。如果路径不经过根节点,那么最大路径和就是左右子树的最大贡献值中较大的一个加上当前节点的值。如果路径经过根节点,那么最大路径和就是左右子树的最大贡献值(如果小于0,则取0)加上当前节点的值。需要用Math.max函数来比较不同情况下的最大值。
2. 解法
思路
一个可能的Java解法是使用递归函数,从根节点开始,计算每个节点的最大贡献值,即该节点和其子树能为上层节点提供的最大路径和。同时,更新一个全局变量max,记录当前的最大路径和。最大贡献值的计算方法是:如果当前节点为空,返回0;否则,计算左右子树的最大贡献值,如果小于0,则取0;然后将当前节点的值加上左右子树的最大贡献值中较大的一个,作为当前节点的最大贡献值;同时,将当前节点的值加上左右子树的最大贡献值(如果小于0,则取0),与max比较,更新max;最后返回当前节点的最大贡献值。
代码逻辑
我来解释一下我的代码逻辑。
- 首先,我定义了一个全局变量max,用来记录当前的最大路径和,初始值为Integer.MIN_VALUE,即整数的最小值。
- 然后,我定义了一个递归函数dfs,参数是一个二叉树节点root,返回值是该节点的最大贡献值。最大贡献值是指该节点和其子树能为上层节点提供的最大路径和。
- 在dfs函数中,我首先判断root是否为空,如果为空,就返回0,表示没有贡献值。
- 如果root不为空,我就递归地计算它的左右子树的最大贡献值left和right。如果left或right小于0,就表示它们对路径和是负贡献,所以我用Math.max函数将它们和0比较,取较大的一个。
- 接下来,我将root的值加上left和right,得到以root为路径中间节点的最大路径和。我用Math.max函数将这个值和max比较,更新max。
- 最后,我将root的值加上left和right中较大的一个,作为root的最大贡献值返回。
- 这样,当我调用dfs(root)时,就可以得到整棵树的最大路径和,并存储在max中。我只需要返回max就是答案。
具体实现
public static class Solution1 { int max = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { dfs(root); return max; } private int dfs(TreeNode root) { if (root == null) { return 0; } int left = Math.max(dfs(root.left), 0); int right = Math.max(dfs(root.right), 0); max = Math.max(max, root.val + left + right); return root.val + Math.max(left, right); } }