力扣第124题-二叉树中的最大路径和

367 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

力扣第124题 二叉树中的最大路径和 如下所示:

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:

输入: root = [-10,9,20,null,null,15,7]
输出: 42
解释: 最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

一、思路

先简单过一下题目,需要注意以下几点:

  • 每个节点在路径中至多出现一次
  • 路径可以不包含根节点

我们需要做的就是返回最大的路径和,那么怎么做才能找到最大的路径和呢?

图解算法

分析题目的解法,我们可以从简单的例子开始。假设有如下的一颗二叉树,需要求其最大的路径和。

image.png

既然是路径和,那么对于每个节点来说只有两种可能:要么选择该节点,要么不选择。我们可以从最左边的叶子节点向右寻找。

tips:下面说的经过某节点的最大值,是指从下往上经过某节点的路径和最大值
  1. 选择最左边叶子节点 -1

image.png

经过此节点的路径和为 -1,此时 ret = -1

  1. 选择父节点 6

我们发现此时 6 > (6 + -1),我们此时需要将 -1 丢弃。则经过节点 6 的最大值为 6,此时 ret 出现了更大的值,故更新 ret = 6

image.png

  1. 继续选择叶子节点 2 和叶子节点 3

很轻易就能得出:经过节点 2 的最大值为 2,经过节点 3 的最大值为 3

image.png

  1. 选择节点 1

我们选择左右孩子中路径和大的节点 3,则经过节点 1 的最大值为 4

image.png

  1. 回到根节点 -5

此时左孩子的路径和最大值为 6,右孩子路径和为 4,故经过根节点 -5 的最大值为 -5 + 6 + 4 = 5

image.png

  1. 很容易我们就能返回路径和的最大值 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);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~