原题链接: https://leetcode.com/problems/house-robber-iii/
House Robber 专题相关题目
198. House Robber
213. House Robber II
337. House Robber III
1. 题目介绍
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.
假设你是一个窃贼,去小区里偷东西。在一个小区里,所有的房子按照二叉树的样子排列。这个小区只有一个入口,那就是二叉树的根节点。在二叉树中,两个直接相邻的节点有报警装置,如果这两个节点的房子都被偷窃了,报警装置会自动报警。树节点的数字就是房子里面的钱数。
在不报警的情况下,求最多可以拿的钱数。
2. 解题思路
动态规划法
注: 本思路来自 https://www.cnblogs.com/zihaowang/p/5317718.html
对于每个节点,考虑它向下能够取到的最大值。使用两个变量,ans[0], ans[1]。
ans[0] 表示:选取当前节点的情况下,子树能取到的最大值。
ans[1] 表示:没有当前节点的情况下,子树能取到的最大值。
然后递归计算即可。
实现代码
class Solution {
public int rob(TreeNode root) {
int[] ans = FindMaxValue(root);
return (ans[0]>ans[1] ? ans[0] : ans[1]);
}
public int[] FindMaxValue(TreeNode root) {
if(root == null) {
return new int[] {0,0};
}
int[] TwoValue = new int [2];
int [] left = FindMaxValue(root.left);
int [] right = FindMaxValue(root.right);
//包括当前节点
TwoValue[0] = root.val +left[1]+right[1];
//不包括当前节点
TwoValue[1] = Math.max(left[0],left[1]) + Math.max(right[0], right[1]);
return TwoValue;
}
}