解题思路: 由于叶子节点一定不要安装监视器,这样才能使总监视器数量比较少,因此需要从下往上进行判断当前节点的状态(共:3种状态):

  • 0: 当前节点安装了监视器
  • 1: 当前节点可观,但没有安装监视器
  • 2: 当前节点不可观

对于空节点,我们认为是可观,但没有安装监视器,因此,叶子节点就为不可观的了,设想一个节点的左右孩子(为空)都可观且没有安装监视器,那该节点必然是不可观即2

有了以上对空节点和叶子节点的处理,我们再来正式分析非终端节点:

  • 若一个节点的左孩子或右孩子不可观,那么该节点必然不可观,需要安装监视器,因此返回0状态
  • 若一个节点的左孩子或右孩子都可观且至少有一个安装了监视器,那么该节点必然是可观的,返回1状态
  • 若一个节点的左右孩子都可观且没安装监视器,那么该节点必然是不可观的,返回2状态

记住,我们以上的分析都是基于从整个二叉树的叶子节点往根部,即从下往上进行,而且要做的就是将不可观的节点变得可观才行(因此要根据左右孩子的节点的状态来判断当前节点状态并做出调整)

这里可能会有疑惑,以上的第一条得出当前节点不可观,然后安装了监视器,而第三条也得出当前节点不可观,但却没有安装监视器,而是直接返回的2状态(当前节点不可观).这是为什么?

因为,对于第一条,因为左右孩子都不可观,为了让左右孩子都可观,则必须给当前节点安装监视器才行,而第三条中,左右孩子都是可观的(没有安装监视器),当前节点的可以直接返回不可观状态,因为后面可以由他的父节点进行摄像头安装,使其变得可观.

方法一:递归

    // 0:该节点安装了监视器 1:该节点可观,但没有安装监视器 2:该节点不可观int monitor = 0;int state(TreeNode* node){if (node == nullptr) return 1;int left  = state(node->left);int right = state(node->right);// 该节点为0的情况if (left == 2 || right == 2){monitor++;  // 由于左或右节点不可观,则需要给当前节点安装监视器,为0状态return 0;} // 为1的情况else if (left == 0 || right == 0)return 1;   // 当(left!=2&&right!=2)时,才会进行该判断,也就是左右节点一定是可观的,再判断是否有一个安装了监视器,如有安装,则当前节点就不需要安装监视器也可观了,为1状态// 为2的情况else    // 其他:党(left!=2&&right!=2)&&(left!=0&&right!=0),即left==1&&right==1时,左右节点都可观,但没有监视器,当前节点不可观,为2状态return 2;}int minCameraCover(TreeNode *root){if (root == nullptr) return 0;if (state(root) == 2) monitor++;    // 如果根节点为2的状态,需要加一个监视器return monitor;}

注意:这里的if,else if,else的顺序是不能变的,先判断左右都是不可观的,再就是都可观,左或右至少有一个为监视器,最后才是都可观都无监视器.

转载于:https://www.cnblogs.com/brianyi/p/10801186.html

【leetcode 968. 监控二叉树】解题报告相关推荐

  1. 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树

    LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...

  2. LeetCode 968. 监控二叉树(DFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉树,我们在树的节点上安装摄像头. 节点上的每个摄影头都可以监视其父对象.自身及其直接子对象. 计算监控树的所有节点所需的最小摄像头数量. 示例 ...

  3. LeetCode 968. 监控二叉树

    https://leetcode-cn.com/problems/binary-tree-cameras/ 难度:困难 给定一个二叉树,我们在树的节点上安装摄像头. 节点上的每个摄影头都可以监视其父对 ...

  4. 【leetcode困难】968. 监控二叉树

    968. 监控二叉树 瞎**分析评论区Rui大佬的答案,这题想直接递归return min还是有坑的,分计数和状态.有个状态转换的思想 转载于:https://www.cnblogs.com/yuel ...

  5. 力扣算法JS LC [714. 买卖股票的最佳时机含手续费] LC [968. 监控二叉树]

    LC 714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你 ...

  6. _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树

    _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...

  7. 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树

    文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...

  8. 代码随想录算法训练营第37天|738. 单调递增的数字,714. 买卖股票的最佳时机含手续费,968. 监控二叉树

    Day 37 738. 单调递增的数字 class Solution { public:int monotoneIncreasingDigits(int n) {string strN = to_st ...

  9. D37 738.单调递增的数字 968.监控二叉树 + 贪心算法总结

    738.单调递增的数字 1.题目 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的数字 x 和 y 满足 x &l ...

最新文章

  1. python 垃圾回收器_Python 垃圾回收机制详细
  2. ymcms SQL注入漏洞
  3. JSP 防止网页刷新重复提交数据
  4. Windows系统编程之进程间通信
  5. JDK1.8 Lambda 使用详解(转)
  6. java params 关键字_转载------C# ref 和 out ,params关键字的用法
  7. hbase的gui工具调研
  8. 【网络安全】关于ARP攻击的原理以及在Kali Linux环境下的实现
  9. 5年财务老员工:早发现这个报表工具,也不会因为加班凄凉辞职
  10. java jar 启动项目,SpringBoot项目运行jar包启动的步骤流程解析
  11. MySQL存储引擎--MyISAM与InnoDB区别
  12. python 进程间通信效率_(1)进程间几种通信方式
  13. utils工具 常见函数
  14. matlab控制信号发生器,Matlab 跳频信号发生器
  15. 监控摄像头角度范围计算方法
  16. OpenCV打开摄像头《大华摄像头》
  17. JavaWeb开发 —— Maven
  18. 如何给注册中心锦上添花?
  19. 利用java创建Excel表格步骤
  20. Popular Verbal English

热门文章

  1. destoon实现调用热门关键字的方法
  2. 兼容性好的CSS字体投影
  3. 用户控件和自定义控件
  4. [转]DotNet for Symbian平台 (Nokia,Sony,Motorola等手机)
  5. Ubuntu 安装 opencv-nonfree
  6. 坚持完成这套学习手册,你就可以去 Google 面试了
  7. 音频降噪在58直播中的研究与实现
  8. React入门0x014: Fragment
  9. Spring AOP 源码分析 - 拦截器链的执行过程
  10. 求一颗二叉树中两个节点的最低公共父节点