刷题的日常-二叉树中的最大路径和

41 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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);
    }

}