LeetCode 热题 HOT 100 Java题解
124. 二叉树中的最大路径和
题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例:
输入:[-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出:42
递归
a
/ \
b c
递归到的节点 a a a,此时路径有三种情况:
- 从 b b b上来经过 a a a继续向上走。
- 从 c c c上来经过 a a a继续向上走。
- 从 b b b上来经过 a a a又到 c c c往下走,等同于从 b b b上来+从从 c c c上来,通过 a a a连接起来。
因此,递归要做的事情就是取上面三者的最大值向上递归,途中记录一个全局最大值。
class Solution {
int res = Integer.MIN_VALUE;
public int recur(TreeNode node) {
if (node == null) return 0;
int left = Math.max(0, recur(node.left));
int right = Math.max(0,recur(node.right));
int ret = Math.max(left + node.val, right + node.val);
res = Math.max(res, Math.max(ret, left + right + node.val));
return ret;
}
public int maxPathSum(TreeNode root) {
recur(root);
return res;
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n)
二叉树中每个节点都被访问一次。
-
空间复杂度: O ( n ) O(n) O(n)
最差情况下二叉树退化为链表,递归深度为 O ( n ) O(n) O(n)。