小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root
。
除了 root
之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。
给定二叉树的 root
。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额_ 。
示例 1:
输入: root = [3,2,3,null,3,null,1] 输出: 7 解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7
示例 2:
输入: root = [3,4,5,1,3,null,1] 输出: 9 解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9
提示:
-
树的节点数在
[1, 104]
范围内 -
0 <= Node.val <= 104
由于题目给出示例的误导,这里存在一个误区:在不选父节点时,子树选最优解不受任何干扰,也就是说子树的跟节点可选也可以不选。所以,可以将这个问题简化为,分选根节点和不选根节点,两种情况考虑:
-
选父节点,则子树必定不能选根节点;
-
如果不选跟节点,则子树可以在选根节点和不选跟节点中选最优解就好。
然后在这上面两种情况中选出最优解。
- 一刷
-
link:{sourcedir}/_0337_HouseRobberIII.java[role=include]
- 二刷
-
link:{sourcedir}/_0337_HouseRobberIii_2.java[role=include]
-
337. 打家劫舍 III - 三种方法解决树形动态规划问题-从入门级代码到高效树形动态规划代码实现 — 从暴力递归,到备忘录,到最优方案,层层推进。