news 2026/3/3 7:25:43

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/2/18 14:29:22

从蒸汽轰鸣到算法狂欢:人类职业演变的史诗三百年(1760-2026)

摘要站在2026年1月的节点回望&#xff0c;人类社会刚刚经历了一场长达三个世纪的狂飙突进。从蒸汽机的第一声轰鸣到人工智能的深度学习&#xff0c;从农业社会的田园牧歌到数字城市的霓虹闪烁&#xff0c;职业——这一人类参与社会分工的核心载体&#xff0c;发生了天翻地覆的重…

作者头像 李华
网站建设 2026/2/21 12:25:28

Zookeeper客户端连接超时问题排查:大数据运维实战

Zookeeper客户端连接超时问题排查&#xff1a;大数据运维实战关键词&#xff1a;Zookeeper、客户端连接超时、大数据运维、问题排查、性能优化摘要&#xff1a;在大数据环境中&#xff0c;Zookeeper作为分布式协调服务起着至关重要的作用。然而&#xff0c;客户端连接超时问题时…

作者头像 李华
网站建设 2026/2/28 16:35:25

用户反馈显示,6个入选排名的AI论文平台操作便捷,尤其擅长改写和降重

针对学术论文写作需求&#xff0c;目前市场上有多种AI工具可同时满足写作辅助与降重需求。这些智能平台通过自然语言处理技术提供论文框架生成、内容优化以及相似度检测功能&#xff0c;适用于毕业论文撰写、课程报告整理等场景。值得注意的是&#xff0c;此类工具应作为效率提…

作者头像 李华
网站建设 2026/2/25 22:06:28

在学术领域,6个推荐的AI论文平台排名靠前,提供写作和降重一站式服务

针对学术论文写作需求&#xff0c;目前市场上有多种AI工具可同时满足写作辅助与降重需求。这些智能平台通过自然语言处理技术提供论文框架生成、内容优化以及相似度检测功能&#xff0c;适用于毕业论文撰写、课程报告整理等场景。值得注意的是&#xff0c;此类工具应作为效率提…

作者头像 李华
网站建设 2026/2/24 11:37:47

万字亿集流量系统架构总结笔记(下)

6通用计数系统 在进行各类计数数据的展示时&#xff0c;初学者非常容易直白地认为数据的统计计数应该来源 于数据记录本身。比如点赞数可以从作品点赞记录数据中统计总数得到&#xff0c;评论数可以从作 品评论记录中统计总数得到……实际上&#xff0c;这样的做法有极大的并发…

作者头像 李华
网站建设 2026/2/26 22:47:26

【课程设计/毕业设计】基于springboot的大型超市购物管理系统基于springboot的线上超市购物管理系统的设计与实现【附源码、数据库、万字文档】

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

作者头像 李华