Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
力扣第124题 二叉树中的最大路径和 如下所示:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1:
输入: root = [-10,9,20,null,null,15,7]
输出: 42
解释: 最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
一、思路
先简单过一下题目,需要注意以下几点:
- 每个节点在路径中至多出现一次
- 路径可以不包含根节点
我们需要做的就是返回最大的路径和,那么怎么做才能找到最大的路径和呢?
图解算法
分析题目的解法,我们可以从简单的例子开始。假设有如下的一颗二叉树,需要求其最大的路径和。
既然是路径和,那么对于每个节点来说只有两种可能:要么选择该节点,要么不选择。我们可以从最左边的叶子节点向右寻找。
tips:下面说的经过某节点的最大值,是指从下往上经过某节点的路径和最大值
- 选择最左边叶子节点
-1
故经过此节点的路径和为 -1,此时 ret = -1
- 选择父节点
6
我们发现此时 6 > (6 + -1),我们此时需要将 -1 丢弃。则经过节点 6 的最大值为 6,此时 ret 出现了更大的值,故更新 ret = 6
- 继续选择叶子节点
2和叶子节点3
很轻易就能得出:经过节点 2 的最大值为 2,经过节点 3 的最大值为 3
- 选择节点
1
我们选择左右孩子中路径和大的节点 3,则经过节点 1 的最大值为 4
- 回到根节点
-5
此时左孩子的路径和最大值为 6,右孩子路径和为 4,故经过根节点 -5 的最大值为 -5 + 6 + 4 = 5
- 很容易我们就能返回路径和的最大值
ret = 6,即最大的路径和为只选择节点6
通过上面的例子,我们不难看出这一题可以使用 递归 来解决。但是需要注意因为最大路径和可能不含根节点,故在遍历子树的时候也需要及时更新最大值 ret
二、实现
实现代码
实现代码与思路中保持一致,只需要注意对一些边界情况的处理即可。
int ret = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return ret;
}
public int dfs(TreeNode root) {
if (root == null) {
return 0;
}
// 先选择左孩子
int leftVal = dfs(root.left); // 经过左孩子的最大值
int rightVal = dfs(root.right); // 经过左孩子的最大值
int tempRet = root.val;
if(leftVal > 0) tempRet += leftVal;
if (rightVal > 0) tempRet += rightVal;
// 更新结果
ret = Math.max(ret, tempRet);
// 经过根节点的最大值
if (leftVal < 0 && rightVal < 0){
return root.val;
}else {
return root.val + Math.max(leftVal, rightVal);
}
}
测试代码
public static void main(String[] args) {
TreeNode root = new TreeNode(1, new TreeNode(2), new TreeNode(3));
TreeNode root1 = new TreeNode(-6,
new TreeNode(6, new TreeNode(-1), null),
new TreeNode(1, new TreeNode(2), new TreeNode(3)));
TreeNode root2 = new TreeNode(5,
new TreeNode(4, new TreeNode(11, new TreeNode(7), new TreeNode(2)), null),
new TreeNode(8, new TreeNode(13), new TreeNode(4, null, new TreeNode(1))));
TreeNode root3 = new TreeNode(9,
new TreeNode(6),
new TreeNode(-3, new TreeNode(-6), new TreeNode(2, new TreeNode(2, new TreeNode(-6, new TreeNode(-6), null), new TreeNode(-6)), null)));
int ret = new Number124().maxPathSum(root3);
System.out.println(ret);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~