news 2026/5/1 7:34:41

day169—递归—打家劫舍Ⅲ(LeetCode-337)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day169—递归—打家劫舍Ⅲ(LeetCode-337)

题目描述

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为root

除了root之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

给定二叉树的root。返回在不触动警报的情况下,小偷能够盗取的最高金额

示例 1:

输入:root = [3,2,3,null,3,null,1]输出:7解释:小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

输入:root = [3,4,5,1,3,null,1]输出:9解释:小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在[1, 104]范围内
  • 0 <= Node.val <= 104

解决方案:

这段代码是基于后序遍历(DFS)求解二叉树打家劫舍问题的核心实现,核心思路是通过递归记录每个节点 “选” 或 “不选” 时的最大收益,最终取整棵树根节点两种状态的最大值,得到能抢劫的最大金额。

核心逻辑

  1. 核心定义

    • dfs(root):递归函数,返回长度为 2 的数组{root_is_val, root_no_val}
      • root_is_val:选择抢劫当前节点时,以该节点为根的子树能获得的最大收益;
      • root_no_val:不选择抢劫当前节点时,以该节点为根的子树能获得的最大收益;
    • max_vector:辅助函数,返回数组中两个元素的最大值(替代原生max,逻辑等价)。
  2. 递归边界:若root为空(!root),返回{0,0}—— 空节点无论选或不选,收益均为 0。

  3. 后序遍历核心逻辑

    • 先递归计算左子节点的 “选 / 不选” 收益left_val = dfs(root->left)
    • 再递归计算右子节点的 “选 / 不选” 收益right_val = dfs(root->right)
    • 计算当前节点 “选” 的收益:root_is_val = left_val[1] + right_val[1] + root->val(选当前节点则左右子节点都不能选,取子节点 “不选” 的收益之和 + 当前节点值);
    • 计算当前节点 “不选” 的收益:root_no_val = max(left_val[0], left_val[1]) + max(right_val[0], right_val[1])(不选当前节点则左右子节点可选可不选,取各自两种状态的最大值之和);
    • 返回当前节点的 “选 / 不选” 收益数组,供父节点计算。
  4. 主函数逻辑:调用dfs(root)得到根节点的 “选 / 不选” 收益数组,通过max_vector取两者最大值,即为整棵树能抢劫的最大金额。

关键特点

  • 时间复杂度 O (n):每个节点仅被递归访问一次,n 为节点数;
  • 空间复杂度 O (h):h 为树的高度,递归栈深度等于树高,返回的数组仅占用常数空间;
  • 状态定义清晰:通过 “选 / 不选” 两个状态拆分问题,符合 “打家劫舍” 的核心规则(不能抢劫相邻节点);
  • 逻辑自洽:选当前节点则子节点必不选,不选当前节点则子节点可选最优状态,完全贴合问题约束。

验证示例(简单二叉树)

假设有如下二叉树:

plaintext

3 / \ 2 3 \ \ 3 1
  • 递归到叶子节点 3(左子树):left_val={3,0},叶子节点 1(右子树):right_val={1,0}
  • 节点 2(左子节点):选则收益 = 0+0+2=2,不选则收益 = 0+0=0 → 返回 {2,0};
  • 节点 3(右子节点):选则收益 = 0+0+3=3,不选则收益 = 0+0=0 → 返回 {3,0};
  • 根节点 3:选则收益 = 0(左不选)+0(右不选)+3=3,不选则收益 = max (2,0)+max (3,0)=5 → 最终返回 max (3,5)=5(正确结果)。

总结

  1. 核心思路:通过后序遍历递归记录每个节点 “选 / 不选” 的最大收益,利用状态转移规则(选则子节点不选,不选则子节点选最优)拆分问题;
  2. 关键设计:用二维数组承载 “选 / 不选” 状态是核心,后序遍历确保先计算子节点再计算父节点;
  3. 功能效果:能正确计算二叉树打家劫舍的最大收益,完全贴合 “不能抢劫相邻节点” 的规则约束。

函数源码:

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: int max_vector(vector<int> nums){ return nums[0]>nums[1]? nums[0]:nums[1]; } vector<int> dfs(TreeNode* root){ if(!root) return {0,0}; vector<int> left_val = dfs(root->left); vector<int> right_val=dfs(root->right); int root_is_val= left_val[1]+right_val[1]+root->val; int root_no_val= max(left_val[0],left_val[1])+max(right_val[0],right_val[1]); return {root_is_val,root_no_val}; } int rob(TreeNode* root) { //return max(dfs(root)[0],dfs(root)[1]); return max_vector(dfs(root)); } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:45:50

学习笔记——I2C(Inter-Intergrated Circuit)总线详解

I2C&#xff08;Inter-Intergrated Circuit&#xff09;总线详解 一、I2C总线基本概念 1.1 I2C简介 I2C&#xff08;Inter-Integrated Circuit&#xff09;是由Philips公司开发的一种串行、同步、半双工的通信总线。主要特点&#xff1a; 两根线&#xff1a;SDA&#xff08;…

作者头像 李华
网站建设 2026/5/1 6:13:51

大数据领域Spark在餐饮行业的数据分析应用

大数据领域Spark在餐饮行业的数据分析应用 关键词:大数据、Spark、餐饮行业、数据分析、应用 摘要:本文聚焦于大数据领域中Spark在餐饮行业数据分析的应用。首先介绍了研究的背景、目的、预期读者等内容,接着阐述了Spark和餐饮行业数据分析的核心概念及联系,详细讲解了相关…

作者头像 李华
网站建设 2026/4/25 20:36:23

炸裂开局!AI应用架构师引领AI驱动流程自动化新方向

炸裂开局&#xff01;AI应用架构师引领AI驱动流程自动化新方向&#xff1a;用大语言模型重构业务流程 告别僵化规则&#xff0c;拥抱认知智能&#xff1a;构建能理解、会决策、可进化的下一代自动化流程。 第一部分&#xff1a;引言与基础 标题&#xff1a; 超越RPA&#xff1a…

作者头像 李华
网站建设 2026/5/1 6:07:09

深度学习篇---图像分类任务

核心比喻&#xff1a;超级快速的“看图说话”游戏想象一下&#xff0c;你正在和一个反应极快的朋友玩一个游戏&#xff1a;游戏规则&#xff1a;你快速翻动手机相册里的照片&#xff0c;每张照片只给他看 0.1秒他必须立刻喊出照片里最主要的东西是什么只能说一个最确定的答案一…

作者头像 李华
网站建设 2026/5/1 6:02:05

Java计算机毕设之基于springboot的线上超市购物管理系统基于SpringBoot的网上购物超市商城管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华