题目
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:
Input: [3,2,3,null,3,null,1]3/ \2 3\ \3 1Output: 7Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
Input: [3,4,5,1,3,null,1]3/ \4 5/ \ \1 3 1Output: 9Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9.
题意
给定一个二叉树,从中选取互不直接相连的若干数,使其和最大。
思路
直接暴力递归也能过,为了优化加上记忆化。
代码实现
Java
class Solution {public int rob(TreeNode root) {Map<TreeNode, Integer> memTo = new HashMap<>();Map<TreeNode, Integer> memNot = new HashMap<>();return Math.max(rob(root, true, memTo, memNot), rob(root, false, memTo, memNot));}private int rob(TreeNode root, boolean canRob, Map<TreeNode, Integer> memTo, Map<TreeNode, Integer> memNot) {if (root == null) {return 0;}if (canRob && memTo.containsKey(root)) {return memTo.get(root);}if (!canRob && memNot.containsKey(root)) {return memNot.get(root);}int toRob = canRob ? root.val + rob(root.left, false, memTo, memNot) + rob(root.right, false, memTo, memNot) : 0;int notRob = rob(root.left, true, memTo, memNot) + rob(root.right, true, memTo, memNot);int tmp = Math.max(toRob, notRob);if (canRob) {memTo.put(root, tmp);} else {memNot.put(root, tmp);}return tmp;}}
