1. 题目描述
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:
输入: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之中;具体来说我们可以对上面两种情况进行分类:
Node在Maxiumu Path之中:
- 只有Node在 Maximum Path之中;
- Node 和 Node.left 在 Maximum Path之中;
- Node 和 Node.right在 Maximum Path之中;
- Node 和 Node.left 和 Node.right 在 Maximum Path之中;
Node不在Maxiumu Path之中:
- Node.left 在 Maximum Path之中;
- 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. 免责声明
※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;