题目
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
- 树中节点数目范围是
[1, 3 * 10^4]
-1000 <= Node.val <= 1000
解题
方法一:DFS
思路
规定一个节点的贡献值是以它为根节点的子树中以该节点为起点的一条节点值之和最大的路径的节点值之和,例如:
那么经过某一节点的最大路径和就是左右子节点贡献值之和加上该节点的值,例如图中求经过点-10的最大路径和就是 ,注意:如果有贡献值为负,那么最大路径和就应该舍去该节点。
所以就可以递归地求出经过每个节点的最大路径和,过程中维护一个最大路径和即可。具体来说,递归对于每个节点:
- 如果该节点为空则返回其贡献值 0。
- 递归地求出其左右子节点的贡献值,如果贡献值为负就它置为 0 表示舍去(左/右)路径。
- 维护最大路径和(
ans
)。 - 返回该节点的贡献值(该节点值加上左右子节点贡献值中较大的一个)。
递归完成后返回之前维护的 ans
即可。
代码
class Solution {
private int ans = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return ans;
}
private int dfs(TreeNode root) {
if (root == null) return 0;
int leftSum = Math.max(0, dfs(root.left));
int rightSum = Math.max(0, dfs(root.right));
ans = Math.max(ans, root.val + leftSum + rightSum);
return root.val + Math.max(leftSum, rightSum);
}
}
评论区