news 2026/5/9 17:19:50

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/5/2 11:53:59

救命神器!专科生必看8款AI论文写作软件测评与推荐

救命神器&#xff01;专科生必看8款AI论文写作软件测评与推荐 2026年专科生论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着AI技术的不断进步&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的论文写作软…

作者头像 李华
网站建设 2026/5/10 10:38:23

华为OD机考双机位C卷- 返回矩阵中非1的元素个数/数值同化 (Java Python JS C++ C )

最新华为上机考试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 华为OD机考双机位C卷 题目描述 存在一个m*n的二维数组,其成员取值范围为0,1,2。 其中值为1的元素具备同化特性,每经过1S,将上下左右值为0的元素同化为1。 而值为2的元素,免疫同化。 将…

作者头像 李华
网站建设 2026/5/9 10:55:17

s7-1500plc与modbustcp通讯错误报16#80c8

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1b65588aea5448c1848a2afebb2b7f52.png#pic_c 1500plc和smart200plc配置如上图所示 通讯报16#80c8是因为下图中的连接参数ID与其他的tcp通讯的连结ID冲突 修改id10 如下图所示问题解决

作者头像 李华
网站建设 2026/5/2 14:21:33

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

核心比喻&#xff1a;给照片上不同区域涂上不同颜色 想象你拿到一张没有颜色的《秘密花园》涂色书&#xff08;就是那种黑白线稿&#xff09;。 传统图像识别的玩法&#xff1a; 问你&#xff1a;“这张图里有什么&#xff1f;” 你回答&#xff1a;“有一个人、一只狗、一棵…

作者头像 李华
网站建设 2026/4/23 7:54:09

探索大数据领域 HDFS 的数据治理方案

探索大数据领域 HDFS 的数据治理方案关键词&#xff1a;HDFS、数据治理、元数据管理、生命周期管理、数据安全摘要&#xff1a;HDFS&#xff08;Hadoop分布式文件系统&#xff09;作为大数据时代的“数字粮仓”&#xff0c;存储着企业海量的核心数据。但随着数据量从TB级跃升至…

作者头像 李华