124. Binary Tree Maximum Path Sum

一刷。。

这个题虽然标记是H,但是写起来不难,不过中间逻辑一开始做得很乱。总体感觉不如刚二刷的333难。。

题里给定义的Path是左-中-右这种连线,有点含糊,其实是说白了就是随便画一条没有分叉的线。。

还是通过Post-Order traversal来bottom-up解决问题。

我们要传上去的信息有:

  1. 我这里的max path 。
  2. 没了。

首先很明显,如果一条线传上去的是负数,那我们宁可不要。 所以左边右边传上来的值要先和0比较。(我一开始没比较,后面才比较很麻烦,所以不如先比较)
eg: leftRes = max(postOrder(root.left),0);

当我有了左右两边的结果,我传上去的结果就有这么几种情况:
1)左右都大于0,那么选择较大的+自己。
2)左右都小于0,那直接选我自己。
3)左右我自己都小于0,无所谓,传上去之后会和0比较,所以这里可以先不管。

然后还要更新一个最大值,最大值有这么几种情况:

  1. 现有max
  2. 自己+左边
  3. 自己+右边
  4. 自己+左边+右边

用max(max, root.val + leftRes + rightRes)
表示是因为我们leftRes, rightRes都和0比较过,比如右边 < 0,我们选择自己 + 左边,此时右边是0,所以可以直接加。

这就是我一开始说的这里判断比较方便,我第一次没和0比较,分别讨论哪边大,是0怎么办之类的很麻烦。。

Time: O(n)
Space: O(n) memory stack

public class Solution {
    int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        dfs(root);
        return res;
    }
    
    public int dfs(TreeNode root) {
        if (root == null) return 0;
        
        int leftRes = Math.max(dfs(root.left), 0);
        int rightRes = Math.max(dfs(root.right), 0);
        
        res = Math.max(res, root.val + leftRes + rightRes);
        
        return Math.max(root.val + leftRes, root.val + rightRes);
    }
}