337. House Robber III

小偷第三题

/*
    一开始的想法是dfs先左树,然后右树在遍历完左树的基础上叠加,这么做的原因是一开始觉得左右孩子相互没有影响,但是后来
    做出来发现不对,才看出来左孩子是对右孩子有影响的,比如没用左孩子,用的父节点,这时候右孩子是用不了父节点的,所以
    遍历完左子树后,右边子树节点有的已经不能用了。
    看了看网上的答案,是用一个数组存取当前节点用和不用两种情况得到的结果
    先不管当前node用不用,把左右子树各自两种情况求出来,如果当前节点不用就直接判断大小相加,如果当前节点用,
    左右孩子就只能不用。
     */
    public int rob(TreeNode root) {
        int[] res =  dp(root);
        return Math.max(res[0],res[1]);
    }
    private int[] dp(TreeNode root)
    {
        if (root==null) return new int[2];
        int[] l = dp(root.left);
        int[] r = dp(root.right);
        int[] cur = new int[2];
        //不用当前节点
        cur[0] = Math.max(l[0],l[1]) + Math.max(r[0],r[1]);
        //用当前节点
        cur[1] = l[0] + r[0] + root.val;
        return cur;
    }

list的add(index,val)方法相当于插入,要修改某个地方用set,这和map的put不一样,map的put之后就直接覆盖了。

原文地址:https://www.cnblogs.com/stAr-1/p/8372318.html