LeetCode-337 打家劫舍III
针对每一个房子
①父房子未偷
我们可以选择偷或者不偷,若是偷则该房子的子房子不具备偷的条件,若是不偷则子房子具有了偷的条件,那么我们可以拿到的最大值就是两种情况下的最大值。
if (canSteal) {
int AddMax = root.val + dfs(root.left, false) + dfs(root.right, false);
int notAddMax = dfs(root.left, true) + dfs(root.right, true);
return Math.max(AddMax, notAddMax);
}
②父房子已偷
那么我们只能选择当前房子不偷,子房子具有偷的权限
else {
int leftMax = dfs(root.left, true);
int rightMax = dfs(root.right, true);
return leftMax+rightMax;
}
完整代码
class Solution {
public static int result;
public int rob(TreeNode root) {
result = 0;
result = dfs(root, true);
return result;
}
private int dfs(TreeNode root, boolean canSteal) {
if (root == null) {
return 0;
}
if (canSteal) {
int AddMax = root.val + dfs(root.left, false) + dfs(root.right, false);
int notAddMax = dfs(root.left, true) + dfs(root.right, true);
return Math.max(AddMax, notAddMax);
} else {
int leftMax = dfs(root.left, true);
int rightMax = dfs(root.right, true);
return leftMax+rightMax;
}
}
}