leetcode337打家劫舍III
阿新 • • 發佈:2019-02-05
不搶劫該節點,則可以搶劫該節點的左右位元組點(注意,node節點不搶不意味著一定要搶它的左右子結點,所以在方法中應該呼叫rob方法,而不是robInclude方法)
程式碼:
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;
}
}
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
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
}
}
小偷又發現一個新的可行竊的地點。 這個地區只有一個入口,稱為“根”。 除了根部之外,每棟房子有且只有一個父房子。 一番偵察之後,聰明的小偷意識到“這個地方的所有房屋形成了一棵二叉樹”。 如果兩個直接相連的房子在同一天晚上被打劫,房屋將自動報警。
在不觸動警報的情況下,計算小偷一晚能盜取的最高金額。