1. 程式人生 > >leetcode337打家劫舍III

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;
}
}

小偷又發現一個新的可行竊的地點。 這個地區只有一個入口,稱為“根”。 除了根部之外,每棟房子有且只有一個父房子。 一番偵察之後,聰明的小偷意識到“這個地方的所有房屋形成了一棵二叉樹”。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。

在不觸動警報的情況下,計算小偷一晚能盜取的最高金額。