1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
private int max = Integer.MIN_VALUE;

public int maxPathSum(TreeNode root) {
maxSum(root);
return max;
}

private int maxSum(TreeNode node) {
if (node == null) {
return 0;
}
int leftTreeMaxSum = Math.max(maxSum(node.left), 0);
int rightTreeMaxSum = Math.max(maxSum(node.right), 0);
max = Math.max(max, node.val + leftTreeMaxSum + rightTreeMaxSum);
return Math.max(leftTreeMaxSum + node.val, rightTreeMaxSum + node.val);
}
}

这个题很有意思是分解问题型递归 + 回溯类型的递归的结合. 递归函数的功能就是告诉我们某个tree从root往下走能组成的最大的sum, 必须包含root. 同时这个递归函数还能带我们去各个node, 这样我们在一个node后看如果该node作为path中的一员, 能组成的max最大是多少. 走遍每一个node, 这样全局的max就能得到了.

时间复杂度: O(n)
空间复杂度: O(n)