337. House Robber III

二刷吧。。不知道为什么house robbery系列我找不到笔记,不过印象中做了好几次了。

不是很难,用的post-order做bottom-up的运算。

对于一个Node来说,有2种情况,一种是选(自己+下下层);一种是选左右children.

其实就是选自己和不选自己的区别。其实更像是dfs的题而不是DP的题。

Time: O(n)
Space: O(lgn)

public class Solution {
    public int rob(TreeNode root) {
        if (root == null) return 0;
        
        int leftLevel = 0;
        int leftSubLevel = 0;
        if (root.left != null) {
            leftLevel = rob(root.left);
            leftSubLevel = rob(root.left.left) + rob(root.left.right);
        } 
        
        int rightLevel = 0;
        int rightSubLevel = 0;
        if (root.right != null) {
            rightLevel = rob(root.right);
            rightSubLevel = rob(root.right.left) + rob(root.right.right);
        }
        
        return Math.max((root.val + leftSubLevel + rightSubLevel), leftLevel + rightLevel);
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/6127932.html