news 2026/3/2 4:24:39

贪心算法专题(十六):完美落幕的终极监控——「监控二叉树」

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贪心算法专题(十六):完美落幕的终极监控——「监控二叉树」

哈喽各位,我是前端小L。

欢迎来到贪心算法专题的大结局! 题目背景很简单:给定一棵二叉树,我们在节点上安装摄像头。

  • 一个摄像头可以监控它自己它的父节点它的子节点

  • 目标:计算监控整棵树所需的最少摄像头数量。

力扣 968. 监控二叉树

https://leetcode.cn/problems/binary-tree-cameras

题目分析:

  • 输入:二叉树的根节点root

  • 输出:摄像头的最小数量。

核心思维:自底向上的贪心

直觉问题:摄像头放在哪最划算?

  • 如果放在叶子节点:它只能监控自己和父节点(最多 2 个)。

  • 如果放在叶子节点的父节点:它可以监控父节点、自己、两个子节点(最多 4 个)。

贪心策略:绝对不要把摄像头放在叶子节点上!这样太浪费了。 我们要让叶子节点的父节点去放摄像头,这样能“以此保三”(保住父、自、子)。

既然要从叶子节点开始考虑,那我们的遍历顺序必须是后序遍历(左右根),即自底向上推导。

状态定义:每个节点可能有三种状态(我们需要用数字标记):

  • 0:无覆盖(该节点没被监控,等着别人来救它)。

  • 1:有摄像头(该节点自己装了摄像头)。

  • 2:有覆盖(该节点被监控了,但不是自己装的,是被子节点或父节点照亮的)。

状态转移逻辑(核心):对于当前节点,我们检查它的左右孩子:

  1. 情况一:左右孩子都有覆盖 (State 2)

    • 孩子都安全了,那当前节点需要装摄像头吗?

    • 不需要。为了贪心(省摄像头),当前节点最好别装,等着它的父节点装摄像头来监控它。

    • 所以当前节点状态设为0 (无覆盖)

  2. 情况二:左右孩子至少有一个无覆盖 (State 0)

    • 只要有一个孩子在呼救,当前节点作为父亲,必须挺身而出!

    • 必须装摄像头

    • cameras++

    • 当前节点状态设为1 (有摄像头)

  3. 情况三:左右孩子至少有一个有摄像头 (State 1)

    • 孩子里有摄像头,那当前节点就被孩子照亮了。

    • 当前节点安全了。

    • 当前节点状态设为2 (有覆盖)

  4. 特殊情况:根节点

    • 遍历结束后,如果根节点状态是 0(无覆盖),因为根节点没有父节点了,没人能救它。

    • 必须给根节点补一个摄像头。

算法流程 (JavaScript)

  1. 定义结果变量res = 0

  2. 定义递归函数traversal(node)

    • 终止条件:如果node为空,返回什么状态?

      • 空节点不能是“无覆盖”,否则叶子节点会为了救空节点而装摄像头(浪费)。

      • 空节点也不能是“有摄像头”。

      • 空节点应该视为“有覆盖” (2)。这样叶子节点看到空孩子是 2,自己就会变成 0(等着父节点来救),符合贪心策略。

    • 递归

      • left = traversal(node.left)

      • right = traversal(node.right)

    • 逻辑判断

      • if (left == 0 || right == 0) -> 装摄像头,res++,返回 1。

      • if (left == 1 || right == 1) -> 被覆盖,返回 2。

      • if (left == 2 && right == 2) -> 无覆盖,返回 0。

  3. 主函数

    • 调用traversal(root)

    • 检查返回值,如果 root 也是 0,res++

    • 返回res

代码实现

深度辨析:为什么顺序不能乱?

在代码中,判断顺序非常关键:

  1. 先判0 (无覆盖):救人要紧。只要有孩子没被覆盖,必须装摄像头。

  2. 再判1 (有摄像头):如果没人求救,但有孩子有摄像头,我就蹭个光。

  3. 最后默认:孩子都安全,我就先“躺平”(状态 0)。

如果你把判断顺序搞乱了,比如先判断有没有被覆盖,可能会导致在需要装摄像头的时候没装,破坏了覆盖结构。

总结:贪心算法毕业典礼

恭喜你!坚持到了这里。 这道题融合了树的遍历状态机局部贪心,是当之无愧的贪心压轴题。

回顾我们的贪心之旅:

  1. 基础:分发饼干(排序+匹配)。

  2. 序列:摆动序列(视觉上的峰谷)。

  3. 股票:买卖股票 II(收集每一滴利润)。

  4. 覆盖:跳跃游戏 I & II(维护最大范围)。

  5. 维度:分发糖果、重建队列(拆分维度,逐个击破)。

  6. 区间:射气球、无重叠、合并区间(Start排序 + 边界更新,这是最重要的模板!)。

  7. 数字:单调递增数字(借位思想)。

  8. 树形:监控二叉树(自底向上状态推导)。

掌握了这些,你已经建立了一套完整的**“贪心直觉”。在未来的面试中,当你面对一个“求最值”的问题,如果 DP 太复杂,不妨先问问自己:“如果我只顾眼前,能不能推导出全局最优?”**

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/27 16:26:36

DM SQL 排序优化-消除排序

在数据库查询优化中,ORDER BY 子句导致的排序操作往往是性能瓶颈之一。当前测试展示如何通过合理的索引设计来消除排序操作,显著提升查询性能。 场景介绍 我们有一个销售表 EMPLOYEE,包含以下字段: HIRE_DATE:入职时…

作者头像 李华
网站建设 2026/2/27 17:15:08

GEO服务商怎么选?2026年企业AI优化采购避坑完全手册

当企业CTO&营销负责人面对市场上数十家声称能够提供生成引擎优化服务的供应商时,GEO服务商怎么选成为一个既紧迫又复杂的决策难题。根据企业数字化采购联盟发布的2026年第一季度报告,超过42%的企业在首次采购GEO服务时因选择不当导致预算浪费&#x…

作者头像 李华
网站建设 2026/2/28 8:45:53

国内a股有什么买点,高确定性的

截至 2025年12月31日,A股正处于“政策底 业绩真空期 资金博弈”的关键节点。虽然市场整体震荡,但结合政策导向、产业趋势、资金动向和估值安全边际,以下 5个方向具备高确定性买点,适合在2026年一季度布局: ✅ 一、【…

作者头像 李华
网站建设 2026/3/2 4:05:04

学长亲荐!专科生毕业论文必备TOP8一键生成论文工具测评

学长亲荐!专科生毕业论文必备TOP8一键生成论文工具测评 2025年专科生论文写作工具测评:为何值得一看? 随着高校教育的不断深化,专科生在毕业论文写作过程中面临的挑战也日益增多。从选题构思到文献检索,再到格式排版与…

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

A 小动物睡眠干扰仪 生物实验资料一览..

什么是大小鼠睡眠干扰仪?睡眠干扰仪可通过输入控制信号控制多个滚筒的转动速度,控制设备与动力设备连接。可以根据需要在控制设备的控制面板上随时调整滚筒转动速度、加速度、方向等。技术参数包含:1、显示:7英寸LCD触摸屏2、记录时间&#x…

作者头像 李华
网站建设 2026/2/28 14:07:05

数据与算法架构提升之路

数据与算法架构提升方法提升数据架构能力数据架构是算法高效运行的基础,优化数据存储、处理与查询方式能显著提升性能。选择合适的数据存储方案 关系型数据库适用于事务处理,NoSQL适合高吞吐场景。例如,MySQL适合结构化数据,Mongo…

作者头像 李华