337. House Robber III [JavaScript]

本文解析了一道类似于198.HouseRobber的算法题,但数据结构改为了二叉树。通过递归方法处理二叉树,并采用记忆化优化大量重复子问题。介绍了递归函数的两种状态返回:当前节点不被抢的最大价值和被抢的最大价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、解题思路

  这道题目与198. House Robber类似,有意思的是它的数据结构换成了二叉树。

  对于二叉树的处理,通常采用递归方法,本题的递归处理方法如下:

const rob = root => {
  if (!root) {
    return 0
  }

  const rv = root.val

  const ll = root.left ? rob(root.left.left) : 0
  const lr = root.left ? rob(root.left.right) : 0
  const rl = root.right ? rob(root.right.left) : 0
  const rr = root.right ? rob(root.right.right) : 0

  return Math.max(rv + ll + lr + rl + rr, rob(root.left) + rob(root.right))
}

  而在大部分的递归处理方法中,都会产生大量的重复子问题,对于这一点可以采用记忆化方法进行优化。

  本题中,可以在递归的过程中向上返回当前节点的两种状态:

  • 当前节点不被抢所产生的最大价值
  • 当前节点被抢所产生的最大价值

二、代码实现

const rob = root => {
  const ans = robSub(root)
  return Math.max(ans[0], ans[1])

  function robSub (root) {
    if (!root) {
      return [0, 0]
    }
    const left = robSub(root.left)
    const right = robSub(root.right)

    const res = []

    // 根节点不抢
    res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1])
    // 根节点抢
    res[1] = root.val + left[0] + right[0]

    return res
  }
}

  如果本文对您有帮助,欢迎关注微信公众号,为您推送更多大前端相关的内容, 欢迎留言讨论,ε=ε=ε=┏(゜ロ゜;)┛。

  您还可以在这些地方找到我:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值