124. Binary Tree Maximum Path Sum(二叉树中的最大路径和)

124. Binary Tree Maximum Path Sum(二叉树中的最大路径和)

1. 题目描述

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

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

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

示例 1

img

输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2:

img

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

题目链接:英文题目中文题目

2.思路解析

这道题最容易想到的就是DFS穷举所有的Path,然后找到Maximum Path,但是这种方法肯定是具耗时的,而且和上一题的问法类似,这题也没有要求求出具体的Path的是什么,所以我们可以利用这点来解题。那么具体应该怎么做呢?

首先,面对一个Node,其实有两种情况:1)该Node在Maxiumu Path之中;2)该Node不在Maximum Path之中;具体来说我们可以对上面两种情况进行分类:

首先,面对一个Node,其实有两种情况:1)该Node在Maxiumu Path之中;2)该Node不在Maximum Path之中;具体来说我们可以对上面两种情况进行分类:

  1. Node在Maxiumu Path之中:

    1. 只有Node在 Maximum Path之中;
    2. Node 和 Node.left 在 Maximum Path之中;
    3. Node 和 Node.right在 Maximum Path之中;
    4. Node 和 Node.left 和 Node.right 在 Maximum Path之中;
  2. Node不在Maxiumu Path之中:

    1. Node.left 在 Maximum Path之中;
    2. Node.right在 Maximum Path之中;

那么我们只需要对上述6种情况进行取最大值操作,最后和全局的最大值进行比较即可。但是还有一个问题:

当前Node究竟需要返回哪个情况的最大值呢?

注意,当前Node应该返回Node在Maximum Path这种情况下的最大值,且其Parent也参与到Maximum Path之中,1)种的四种情况,只有1.4是不包含Node.parent在Maximum Path的,所以我们只需要返回1.1 和 1.2 和 1.3,三者之中的最大值即可。从这点也说明,Maximum Path一定向下取,就不能返回,所以当我们包含某个Node,那么我们只能包含其左孩子或右孩子,而不能两者都取到,否则该Node会被重复计算两次,不符合题目要求。

3.代码

个人算法项目:Algorithm

int maxGlobal = Integer.MIN_VALUE;

public int maxPathSum( TreeNode root ) {
    findMax( root );
    return maxGlobal;
}

// reference resource: https://leetcode.com/problems/binary-tree-maximum-path-sum/discuss/389609/Full-Explanation-article-with-pseudo-code-Beats-JAVA-100-time-and-100-space-Solution
int findMax( TreeNode n ) {
    if ( n == null ) return 0;

    // get max from left and right subtree separately.
    int maxL = findMax( n.left );
    int maxR = findMax( n.right );

    // maximize only including one of the subtrees.
    int maxLR = Math.max( maxL, maxR );
    // maximize between only the root and root plus one of the subtrees.
    int maxRootIncluded = Math.max( n.val, n.val + maxLR );
    // maximize between others and root plus two subtrees,
    // but in this way, its parents will be excluded.
    int maxAll = Math.max( maxRootIncluded, n.val + maxL + maxR );

    // update global max.
    maxGlobal = Math.max( maxGlobal, maxAll );

    // return the local maximum,
    // and assume this root is included in the maxiumu path.
    return maxRootIncluded;
}

4. 参考资料

5. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值