题目
LeetCode :337
思路分析
思路基本上就与打家劫舍差不多,要注意的是因为是二叉树的形式,所以每次可以同时打劫两个房间(左和右),选择上还是分为打劫当前房间或不打劫当前房间,最终求出最大值。
代码展示
class Solution {
Map<TreeNode, Integer> map = new HashMap<>();
public int rob(TreeNode root) {
if(root == null)
return 0;
if(map.containsKey(root)){//记忆化搜索
return map.get(root);
}
//取
int val1 = root.val + ((root.left == null) ? 0 : rob(root.left.left) + rob(root.left.right)) + ((root.right == null) ? 0 : rob(root.right.left) + rob(root.right.right));
//不取
int val2 = rob(root.left) + rob(root.right);
int result = (val1 >= val2) ? val1 : val2;
map.put(root, result);
return result;
}
}