小偷又发现了自己盗窃的新地方。 这个区域只有一个入口,称为“根”。 除了根之外,每个房子都有一个且只有一个父母的房子。 巡逻后,聪明的小偷意识到“这个地方的所有房屋都形成了一棵二叉树”。 如果两个直接连接的房屋在同一天晚上被闯入,它将自动联系警方。
确定小偷今晚可以抢劫的最大金额,而不会提醒警方。
** 题目连接**
正确答案
采用dfs
class Solution {
public int rob(TreeNode root) {
int[] res = robSub(root);
return Math.max(res[0], res[1]);
}
//返回一个含有两个元素的数组,第一个是不包含root时所得到的最优值,第二个是包含root时所得到的最优解
private int[] robSub(TreeNode root){
if(root==null) return new int[2];
int[] left = robSub(root.left);
int[] right = robSub(root.right);
int[] res = new int[2];
res[0]=Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
res[1]=root.val+left[0]+right[0];
return res;
}
}
错误答案
题目理解错误,不是隔一层就可以了,正确答案可能可以隔很多层,采用了按层遍历思想
class Solution {
public int rob(TreeNode root) {
if(root == null) return 0;
List<TreeNode> list = new LinkedList<TreeNode>();
list.add(root);
int ans1=0,ans2=0;
int start = 0;
int end = 0;
int new_end = end;
while(start <= end)
{
while(start <= end)
{
ans1 += list.get(start).val;
if(list.get(start).left!=null)
{
list.add(list.get(start).left);new_end++;
}
if(list.get(start).right!=null)
{
list.add(list.get(start).right);new_end++;
}
start++;
}
end = new_end;
int ans = ans1;
ans1 = ans2;
ans2 = ans;
}
return Math.max(ans1,ans2);
}
}