原题网址:https://leetcode.com/problems/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 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7 .
Example 2:
3 / \ 4 5 / \ \ 1 3 1Maximum amount of money the thief can rob = 4 + 5 = 9 .
方法:类似动态规划,递归遍历所有节点,返回两种结果,一种是包含本节点的最大值,另一种是不含本节点的最大值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private int[] dp(TreeNode root) {
// money[0] root inclusive, money[1] root excluded
int[] money = new int[2];
money[0] = root.val;
if (root.left != null) {
int[] left = dp(root.left);
money[0] += left[1];
money[1] += Math.max(left[0], left[1]);
}
if (root.right != null) {
int[] right = dp(root.right);
money[0] += right[1];
money[1] += Math.max(right[0], right[1]);
}
return money;
}
public int rob(TreeNode root) {
if (root == null) return 0;
int[] money = dp(root);
return Math.max(money[0], money[1]);
}
}
另一种实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
private int[] dp(TreeNode root) {
// m[0] 最大收益(无论偷还是不偷本房屋)
// m[1] 最大收益(不偷本房屋)
int[] m = new int[2];
m[0] = root.val;
if (root.left != null) {
int[] left = dp(root.left);
m[1] += left[0];
m[0] += left[1];
}
if (root.right != null) {
int[] right = dp(root.right);
m[1] += right[0];
m[0] += right[1];
}
m[0] = Math.max(m[0], m[1]);
return m;
}
public int rob(TreeNode root) {
if (root == null) return 0;
int[] m = dp(root);
return m[0];
}
}