打家劫舍III在打家劫舍的基础上进行了改编,数组变成了树,要解决这个问题,无非是进行分类讨论,进而得到状态转移方程 1.取当前值,则左右节点的值不能取,应当取不包括左右节点的左右子树的最大值 加上 当前值 2.不取当前值,则取左右子树的最大值(左右节点可取可不取)
class Solution {
public int rob(TreeNode root) {
int[] res = maxValue(root);
return Math.max(res[0], res[1]);
}
private int[] maxValue(TreeNode node) {
if (node == null) return new int[2];
// res[0]表示不取当前值 res[1]表示取当前值
int[] res = new int[2];
int[] left = maxValue(node.left);
int[] right = maxValue(node.right);
// 不取当前值,那就取左右子树的最大值(不管左右子节点取不取)
res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
// 取当前值,就取不包括子节点的左右子树的最大值,加上本身
res[1] = left[0] + right[0] + node.val;
return res;
}
}
相关问题