leetcode337打家劫舍III

不抢劫该节点,则可以抢劫该节点的左右字节点(注意,node节点不抢不意味着一定要抢它的左右子结点,所以在方法中应该调用rob方法,而不是robInclude方法)
public int robExclude(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return rob(node.left) + rob(node.right);
    }

抢劫该节点的话就不能抢劫该节点的左右子节点,所以应该调用robExclude(node.right) + robExclude(node.left) + 该节点的值
public int robInclude(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return robExclude(node.right) + robExclude(node.left) + node.val;
    }

最后统一调用rob方法来获取能抢劫的最大值,那就有两种选择,抢劫根节点和不抢劫根节点
所以
public int rob(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return Math.max(robExclude(root), robInclude(root));
    }
选取最大的那个方案就是能打劫的最多的值。

代码:
class TreeNode {
int val ;
TreeNode left ;
TreeNode right ;
TreeNode( int x) { val = x ; }
}
class Solution {
public int rob(TreeNode root) {
if (root == null) {
return 0 ;
}
return Math. max(robExclude(root) , robInclude(root)) ;
}
public int robExclude(TreeNode node) {
if (node == null) {
return 0 ;
}
return rob(node. left) + rob(node. right) ;
}
public int robInclude(TreeNode node) {
if (node == null) {
return 0 ;
}
return robExclude(node. right) + robExclude(node. left) + node. val ;
}
}

小偷又发现一个新的可行窃的地点。 这个地区只有一个入口,称为“根”。 除了根部之外,每栋房子有且只有一个父房子。 一番侦察之后,聪明的小偷意识到“这个地方的所有房屋形成了一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

在不触动警报的情况下,计算小偷一晚能盗取的最高金额。

 
  

你可能感兴趣的:(leetcode,337,打家劫舍)