本题是打家劫舍类型题第三种类型,数组换成了二叉树结构。
这里只贴出最优解决方案。
这里利用一个数组记录每个节点偷与不偷的情况。
详细请看注释。
class Solution {
public int rob(TreeNode root) {
int [] res = robdp (root);
return Math.max(res[0], res[1]);
}
public int[] robdp(TreeNode root){
if (root == null) return new int[2]; //初始化{0,0}
//0表示不偷,1表示偷
int[] res = new int[2];
int[] left = robdp(root.left);
int[] right = robdp(root.right);
//当前节点不抢,左子树能偷的钱,和右子树能偷的钱
res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
//当前节点被抢,左右子树选择不偷
res[1] = root.val + left[0] + right[0];
return res;
}
}