【leetcode 968. 监控二叉树】解题报告
解题思路: 由于叶子节点一定不要安装监视器,这样才能使总监视器数量比较少,因此需要从下往上进行判断当前节点的状态(共: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. 监控二叉树】解题报告相关推荐
- 【算法】贪心算法:LeetCode 714 买卖股票的最佳时机含手续费 、LeetCode 968 监控二叉树
LeetCode 714 买卖股票的最佳时机含手续费 (中等) 题目 描述 给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你 ...
- LeetCode 968. 监控二叉树(DFS)
文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉树,我们在树的节点上安装摄像头. 节点上的每个摄影头都可以监视其父对象.自身及其直接子对象. 计算监控树的所有节点所需的最小摄像头数量. 示例 ...
- LeetCode 968. 监控二叉树
https://leetcode-cn.com/problems/binary-tree-cameras/ 难度:困难 给定一个二叉树,我们在树的节点上安装摄像头. 节点上的每个摄影头都可以监视其父对 ...
- 【leetcode困难】968. 监控二叉树
968. 监控二叉树 瞎**分析评论区Rui大佬的答案,这题想直接递归return min还是有坑的,分计数和状态.有个状态转换的思想 转载于:https://www.cnblogs.com/yuel ...
- 力扣算法JS LC [714. 买卖股票的最佳时机含手续费] LC [968. 监控二叉树]
LC 714. 买卖股票的最佳时机含手续费 给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 :整数 fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你 ...
- _32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 、714.买卖股票的最佳时机含手续费、968.监控二叉树
_32LeetCode代码随想录算法训练营第三十二天-贪心算法 | 738.单调递增的数字 .714.买卖股票的最佳时机含手续费.968.监控二叉树 题目列表 738.单调递增的数字 714.买卖股票 ...
- 力扣刷题day32|738单调递增的数字、714买卖股票的最佳时机含手续费、968监控二叉树
文章目录 738. 单调递增的数字 思路 难点:遍历顺序 难点:设置flag 714. 买卖股票的最佳时机含手续费 贪心思路 难点 968. 监控二叉树 思路 难点:如何隔两个节点放一个摄像头 738 ...
- 代码随想录算法训练营第37天|738. 单调递增的数字,714. 买卖股票的最佳时机含手续费,968. 监控二叉树
Day 37 738. 单调递增的数字 class Solution { public:int monotoneIncreasingDigits(int n) {string strN = to_st ...
- D37 738.单调递增的数字 968.监控二叉树 + 贪心算法总结
738.单调递增的数字 1.题目 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增. (当且仅当每个相邻位数上的数字 x 和 y 满足 x &l ...
最新文章
- python 垃圾回收器_Python 垃圾回收机制详细
- ymcms SQL注入漏洞
- JSP 防止网页刷新重复提交数据
- Windows系统编程之进程间通信
- JDK1.8 Lambda 使用详解(转)
- java params 关键字_转载------C# ref 和 out ,params关键字的用法
- hbase的gui工具调研
- 【网络安全】关于ARP攻击的原理以及在Kali Linux环境下的实现
- 5年财务老员工:早发现这个报表工具,也不会因为加班凄凉辞职
- java jar 启动项目,SpringBoot项目运行jar包启动的步骤流程解析
- MySQL存储引擎--MyISAM与InnoDB区别
- python 进程间通信效率_(1)进程间几种通信方式
- utils工具 常见函数
- matlab控制信号发生器,Matlab 跳频信号发生器
- 监控摄像头角度范围计算方法
- OpenCV打开摄像头《大华摄像头》
- JavaWeb开发 —— Maven
- 如何给注册中心锦上添花?
- 利用java创建Excel表格步骤
- Popular Verbal English