本题
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
3 / \ 2 3 \ \ 3 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7 .
Example 2:
3 / \ 4 5 / \ \
我们维护一个大小为2的数组,res,res【0】存储抢劫此房最大获利,res【1】存储不抢劫此房间最大获利。随后我们在深度遍历的基础上,利用公式res[0] = root.val+left[1]+right[1];//子房间不能被抢劫 res[1] = Math.max(left[0], left[1])+ Math.max(right[0], right[1]);//子房间可以被抢劫或者不被抢劫,返回最大值。
其中left,right数组为递归调用robber函数返回的当前节点左右子节点的被抢劫或者不被抢劫最大获利。
返回res。
class Solution {
public int rob(TreeNode root) {
int[] nums = robber(root);
return Math.max(nums[0], nums[1]);
}
private int[] robber(TreeNode root) {
if(root==null){
return new int[2];
}
int[] left = robber(root.left);
int[] right = robber(root.right);
int[] res = new int [2];
res[0] = root.val+left[1]+right[1];
res[1] = Math.max(left[0], left[1])+ Math.max(right[0], right[1]);
return res;
}
}