LeetCode 337. House Robber III
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 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
Example 2:
3 / \ 4 5 / \ \ 1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.
思路
rob两种情况:1.取当前节点以及当前节点的孙子节点的值的和 2.取当前节点的孩子节点的值的和。然后取两者最大值.
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class Solution { public int helprob(Map<TreeNode, Integer> map, TreeNode root) { if(root == null){ return 0; } if(map.containsKey(root)){ return map.get(root); } int res = 0; if(root.left != null){ res += helprob(map, root.left.left) + helprob(map, root.left.right); } if(root.right != null){ res += helprob(map, root.right.left) + helprob(map, root.right.right); } res = Math.max(root.val + res, helprob(map, root.left) + helprob(map, root.right)); map.put(root, res); return res; } public int rob(TreeNode root){ //定义一个map来存储取每个节点的最大值 Map<TreeNode, Integer> map = new HashMap<>(); return helprob(map, root); } }