|
| 1 | +#### 337. 打家劫舍 III |
| 2 | + |
| 3 | +难度:中等 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 `root` 。 |
| 8 | + |
| 9 | +除了 `root` 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 **两个直接相连的房子在同一天晚上被打劫** ,房屋将自动报警。 |
| 10 | + |
| 11 | +给定二叉树的 `root` 。返回 _ **在不触动警报的情况下** ,小偷能够盗取的最高金额_ 。 |
| 12 | + |
| 13 | + **示例 1:** |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +``` |
| 18 | +输入: root = [3,2,3,null,3,null,1] |
| 19 | +输出: 7 |
| 20 | +解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7 |
| 21 | +``` |
| 22 | + |
| 23 | + **示例 2:** |
| 24 | + |
| 25 | + |
| 26 | + |
| 27 | +``` |
| 28 | +输入: root = [3,4,5,1,3,null,1] |
| 29 | +输出: 9 |
| 30 | +解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9 |
| 31 | +``` |
| 32 | + |
| 33 | + **提示:** |
| 34 | + |
| 35 | +* 树的节点数在 `[1, 10^4]` 范围内 |
| 36 | +* `0 <= Node.val <= 10^4` |
| 37 | + |
| 38 | +--- |
| 39 | + |
| 40 | +深度优先搜索: |
| 41 | + |
| 42 | +假设当前节点不选择,那么当前节点的最大盗取金额为左节点的最大值(不管左节点选还是不选)和右节点的最大值(同样的,不管右节点选还是不选)。 |
| 43 | + |
| 44 | +递归方法的返回类型应为长度为 `2` 的数组,第一个元素表示选当前节点的最大值,第二个元素表示不选当前节点的最大值。 |
| 45 | + |
| 46 | +```Java |
| 47 | +/** |
| 48 | + * Definition for a binary tree node. |
| 49 | + * public class TreeNode { |
| 50 | + * int val; |
| 51 | + * TreeNode left; |
| 52 | + * TreeNode right; |
| 53 | + * TreeNode() {} |
| 54 | + * TreeNode(int val) { this.val = val; } |
| 55 | + * TreeNode(int val, TreeNode left, TreeNode right) { |
| 56 | + * this.val = val; |
| 57 | + * this.left = left; |
| 58 | + * this.right = right; |
| 59 | + * } |
| 60 | + * } |
| 61 | + */ |
| 62 | +class Solution { |
| 63 | + public int rob(TreeNode root) { |
| 64 | + int[] array = dfs(root); |
| 65 | + return Math.max(array[0], array[1]); |
| 66 | + } |
| 67 | + |
| 68 | + private int[] dfs(TreeNode root){ |
| 69 | + if(root == null) return new int[]{0, 0}; |
| 70 | + int[] left = dfs(root.left); |
| 71 | + int[] right = dfs(root.right); |
| 72 | + int selected = root.val + left[1] + right[1]; |
| 73 | + int notSelected = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); |
| 74 | + return new int[]{selected, notSelected}; |
| 75 | + } |
| 76 | +} |
| 77 | +``` |
0 commit comments