持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
刷题的日常-2022年10月14号
一天一题,保持脑子清爽
二叉树中的最大路径和
来自leetcode的 124 题,题意如下:
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
理解题意
通过题意,我们可以将信息整理如下:
- 题目给定一个二叉树
- 要求我们返回二叉树中的最大路径和
- 最大路径和是指沿着树中的任意节点,可以往父节点或子节点,到达另外任意节点的值的和,要求返回其中最大的路径
做题思路
从任意节点出发到达另外一个节点计算最大和,有几种情况要考虑。第一个情况,当前节点和左右子树的和小于零,这个时候不加上去是最好的。第二种情况,当前节点与左右子树的和大于零,可以将当前节点考虑进去,返回上一层进行判断。步骤如下:
- 左右子树进行递归判断
- 当前节点如果小于零,要查看左右子树和当前节点和的情况
- 最后还需要判断下左右子树,和当前节点的和取最大值
代码实现
代码实现如下:
public class Solution {
int result = 0;
public int maxPathSum(TreeNode root) {
result = root.val;
maxSum(root);
return result;
}
private int maxSum(TreeNode root) {
if (root == null) {
return 0;
}
int leftMax = maxSum(root.left);
int rightMax = maxSum(root.right);
if (root.val < 0) {
int sum = root.val;
if (root.left != null) {
sum += leftMax;
result = Math.max(leftMax, result);
}
if (root.right != null) {
sum += rightMax;
result = Math.max(rightMax, result);
}
result = Math.max(result, sum);
return Math.max(Math.max(leftMax + root.val, rightMax + root.val), root.val);
}
result = Math.max(result, Math.max(leftMax + root.val, rightMax + root.val));
result = Math.max(result, leftMax + root.val + rightMax);
result = Math.max(result, root.val);
return Math.max(Math.max(leftMax + root.val, rightMax + root.val), root.val);
}
}