Skip to content

337.打家劫舍-iii

题解

递归解法

js
const map = new Map();
/**
 * @param {TreeNode} root
 * @return {number}
 */
var rob = function (root) {
  if (!root) return 0;
  if (!root.left && !root.right) return root.val;
  if (map.has(root)) {
    return map.get(root);
  }
  // 偷父节点
  let val1 = root.val;
  if (root.left) val1 += rob(root.left.left) + rob(root.left.right);
  if (root.right) val1 += rob(root.right.left) + rob(root.right.right);

  let val2 = rob(root.left) + rob(root.right);
  const res = Math.max(val1, val2);
  map.set(root, res);
  return res;
};
const map = new Map();
/**
 * @param {TreeNode} root
 * @return {number}
 */
var rob = function (root) {
  if (!root) return 0;
  if (!root.left && !root.right) return root.val;
  if (map.has(root)) {
    return map.get(root);
  }
  // 偷父节点
  let val1 = root.val;
  if (root.left) val1 += rob(root.left.left) + rob(root.left.right);
  if (root.right) val1 += rob(root.right.left) + rob(root.right.right);

  let val2 = rob(root.left) + rob(root.right);
  const res = Math.max(val1, val2);
  map.set(root, res);
  return res;
};

动态规划解法

js
function robTree(cur) {
  if (!cur) return [0, 0]; // 长度为2的数组,0:不偷,1:偷
  const left = robTree(cur.left);
  const right = robTree(cur.right);
  // 偷父节点,左右节点不偷
  const val1 = cur.val + left[0] + right[0];
  // 不偷父节点, 左边节点偷或者不偷的最大值 + 右边节点偷或者不偷的最大值
  const val2 = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
  return [val2, val1];
}
/**
 * @param {TreeNode} root
 * @return {number}
 */
var rob = function (root) {
  return Math.max(...robTree(root));
};
function robTree(cur) {
  if (!cur) return [0, 0]; // 长度为2的数组,0:不偷,1:偷
  const left = robTree(cur.left);
  const right = robTree(cur.right);
  // 偷父节点,左右节点不偷
  const val1 = cur.val + left[0] + right[0];
  // 不偷父节点, 左边节点偷或者不偷的最大值 + 右边节点偷或者不偷的最大值
  const val2 = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
  return [val2, val1];
}
/**
 * @param {TreeNode} root
 * @return {number}
 */
var rob = function (root) {
  return Math.max(...robTree(root));
};