news 2026/5/1 9:51:29

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

作者头像

张小明

前端开发工程师

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/5/1 7:24:25

CMP-C9-Azido-sialic Acid — 糖合成与生物偶联的关键修饰糖核苷酸

CMP-C9-Azido-sialic Acid 是一种经过化学修饰的糖核苷酸,属于Sugar Nucleotides类别。它在糖生物学、药物开发和诊断研究领域具有重要价值,通过引入叠氮基团,为糖链的精准修饰和功能化提供了强大工具。这种分子不仅扩展了糖科学的研究边界&a…

作者头像 李华
网站建设 2026/5/1 8:39:54

深度测评9个AI论文工具,助研究生高效完成论文写作!

深度测评9个AI论文工具,助研究生高效完成论文写作! AI 工具如何改变论文写作的未来 在当今信息爆炸的时代,研究生们面临着前所未有的学术挑战。无论是撰写开题报告、完成实验分析,还是最终的论文定稿,每一个环节都需要…

作者头像 李华
网站建设 2026/5/1 9:08:58

AI Coding在嵌入式开发中的应用

文章由来最近在测试各种AI Coding工具,通常以python 小项目作为测试内容。发现现在的AI coding工具越来越智能了。以后的工程师将面临两极分化,小白级(只会用AI写代码),大神级(优化AI的前沿工程师&#xff…

作者头像 李华
网站建设 2026/5/1 8:14:39

2025 博客成长复盘:我的博客生涯迎来深度质变

当2025年的日历翻到最后一页,我点开CSDN的年度创作总结页面时,屏幕上跳出的“2017年03月07日,我们和你第一次相遇”突然撞进眼里——原来从注册CSDN账号到成为一名持续输出的博主,已经走过了近9个年头。而2025这一年,3…

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

Eclipse 工作空间:深入解析与高效使用指南

Eclipse 工作空间:深入解析与高效使用指南 引言 Eclipse,作为一款功能强大的集成开发环境(IDE),在Java开发领域有着举足轻重的地位。本文将深入解析Eclipse工作空间的概念、配置方法以及高效使用技巧,帮助开发者更好地掌握这一开发工具。 一、Eclipse工作空间概述 1.…

作者头像 李华
网站建设 2026/4/23 17:19:42

ZWPD 开放生态:打通设计 - 施工 - 交付 - 运维的工业数据链路

流程工业数字化转型中,数据是核心资产,但设计、施工、交付、运维四阶段长期存在“数据孤岛”,导致项目周期长、成本高、效率低,数字化交付质量难以保障。国产三维工厂设计平台中维ZWPD以“开放生态”为核心战略,通过接…

作者头像 李华