0337. House Robber III
Last updated
Last updated
**Input:** root = [3,2,3,null,3,null,1]
**Output:** 7
**Explanation:** Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.**Input:** root = [3,4,5,1,3,null,1]
**Output:** 9
**Explanation:** Maximum amount of money the thief can rob = 4 + 5 = 9./**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int rob(TreeNode root) {
return helper(root, true);
}
private int helper(TreeNode root, boolean canRob) {
// exit
if (root == null) return 0;
if (root.left == null && root.right == null) {
return canRob ? root.val : 0;
}
if (canRob) {
// rob root
int rob = root.val + helper(root.left, false) + helper(root.right, false);
// dont rob root
int notRob = helper(root.left, true) + helper(root.right, true);
return Math.max(rob, notRob);
} else {
return helper(root.left, true) + helper(root.right, true);
}
}
}
/*
can rob: 1) rob, children can't rob; 2) don't rob, children can rob
cant rob: children can rob
*//**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int rob(TreeNode root) {
Money m = helper(root);
return Math.max(m.rob, m.notrob);
}
private Money helper(TreeNode root) {
Money curr = new Money();
// exit
if (root == null) return curr;
Money left = helper(root.left);
Money right = helper(root.right);
curr.rob = root.val + left.notrob + right.notrob;
curr.notrob = Math.max(left.rob, left.notrob) + Math.max(right.rob, right.notrob);
return curr;
}
class Money {
int rob;
int notrob;
public Money() {
this.rob = 0;
this.notrob = 0;
}
}
}
/*
can rob: 1) rob, children can't rob; 2) don't rob, children can rob
cant rob: children can rob
*/