首页 > 其他分享 >337. 打家劫舍 III

337. 打家劫舍 III

时间:2025-01-16 22:53:53浏览次数:1  
标签:node preorder right root 337 打家劫舍 III 节点 left

337. 打家劫舍 III

var rob = function(root) {
    function dfs(node) {
        if (!node) return [0, 0]; // [不偷当前节点的最大金额, 偷当前节点的最大金额]

        const left = dfs(node.left);
        const right = dfs(node.right);

        // 如果不偷当前节点,那么可以偷或不偷左右子节点
        const notRobCurrent = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);

        // 如果偷当前节点,那么不能偷左右子节点
        const robCurrent = node.val + left[0] + right[0];

        return [notRobCurrent, robCurrent];
    }

    const result = dfs(root);
    return Math.max(result[0], result[1]);
};

function TreeNode(val, left, right) {
  this.val = val === undefined ? 0 : val;
  this.left = left === undefined ? null : left;
  this.right = right === undefined ? null : right;
}

function buildTree(preorder) {
  if (preorder.length === 0) return null;

  let root = new TreeNode(preorder[0]);
  let queue = [root];
  let i = 1;

  while (i < preorder.length) {
    let currentNode = queue.shift();

    if (preorder[i] !== null) {
      currentNode.left = new TreeNode(preorder[i]);
      queue.push(currentNode.left);
    }
    i++;

    if (i < preorder.length && preorder[i] !== null) {
      currentNode.right = new TreeNode(preorder[i]);
      queue.push(currentNode.right);
    }
    i++;
  }

  return root;
}
var rob = function (root) {
  if (!root) return 0;
  let evenSum = 0,
    oddSum = 0;
  function dfs(node, higt) {
    if (!node) return [0, 0]; //返回两个值:[偷当前节点的最大金额, 不偷当前节点的最大金额]
    // 递归计算左子树和右子树的最大金额
    let left = dfs(node.left, higt + 1);
    let right = dfs(node.right, higt + 1);
    // 如果偷当前节点,则不能偷其左右子节点
    const robThisNode = node.val + left[1] + right[1];
    // 如果不偷当前节点,则可以选择偷或不偷其左右子节点
    const notRobThisNode =
      Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
    if (higt % 2 === 0) {
      evenSum = Math.max(robThisNode, notRobThisNode);
    } else {
      oddSum = Math.max(robThisNode, notRobThisNode);
    }
    // 返回当前节点偷和不偷的最大金额
    return [robThisNode, notRobThisNode];
  }
  dfs(root, 0);
  return Math.max(evenSum, oddSum);
};

// 构建二叉树
let preorder = [4, 1, null, 2, null, 3];
let root = buildTree(preorder);
console.log(rob(root));

'

标签:node,preorder,right,root,337,打家劫舍,III,节点,left
From: https://www.cnblogs.com/KooTeam/p/18675894

相关文章

  • 213. 打家劫舍 II
    213.打家劫舍IIvarrob=function(nums){if(!Array.isArray(nums)||nums.some(isNaN)){thrownewError("Invalidinput:numsmustbeanarrayofnumbers");}constn=nums.length;if(n===0)return0;if(n===1)......
  • p3373
    Description如题,已知一个数列,你需要进行下面三种操作:将某区间每一个数乘上 xx;将某区间每一个数加上 xx;求出某区间每一个数的和。Input第一行包含三个整数 n,q,mn,q,m,分别表示该数列数字的个数、操作的总个数和模数。第二行包含 nn 个用空格分隔的整数,其中第 ii 个......
  • [luoguP3376] 网络最大流
    题意给出一个网络,求流量的最大值sol网络流板子题。网络流是OI中比较常用的算法之一,以较高的建图难度深受出题人喜爱,不过近几年题目数量减少。当然,在学习建图之前,需要先学会网络流的板子。一些定义(部分摘自OI-Wiki)网络是特殊的有向图\(G=(V,E)\);源点\(s\)是网络的起......
  • 198. 打家劫舍
    [题目链接](198.打家劫舍-力扣(LeetCode))解题思路:比较经典的动态规划。从左往右尝试。来到index位置,有两种选择,不偷,那么就去index+1位置做决策,偷,那么就去index+2做决策。直接加dp表即可。代码classSolution:defprocess(self,nums,index,dp):......
  • 打家劫舍(动态规划)
    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内......
  • 1651. Hopper 公司查询 III - 力扣(LeetCode)
    1651.Hopper公司查询III-力扣(LeetCode)目标输入表:AcceptedRidesride_iduser_idrequested_at6752019/12/91542020/2/910632020/3/419392020/4/63412020/6/313522020/6/227692020/7/1617702020/8/2520812020/11/25572020/11/92422020/12/911682021/1/1115322021/1/1712......
  • 732. 我的日程安排表 III
    当 k 个日程存在一些非空交集时(即, k 个日程包含了一些相同时间),就会产生 k 次预订。给你一些日程安排 [startTime,endTime) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。实现一个 MyCalendarThree 类来存放你的......
  • 树形DP学习笔记(二):打家劫舍III & 监控二叉树
    参考:树形DP:打家劫舍III【基础算法精讲24】_哔哩哔哩_bilibili树形DP:监控二叉树【基础算法精讲25】_哔哩哔哩_bilibilips:笔记中的代码按本人理解整理,重思路,对比原视频中的代码稍有改动往期:树形DP学习笔记(一):树的路径问题-CSDN博客状态机DP学习笔记-CSDN博客【如果笔记......
  • leetcode 213. 打家劫舍 II
    213.打家劫舍II与  198.打家劫舍  相比,多了首和尾不能同时偷的条件但是没写出来......
  • 路径总和 III(递归)
    给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例1:输入:root=[10,5,-3,3,2,null,11,3,-2,null,1]......