给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。

示例 1:

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:

输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。

提示:

给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。

————————————————————————————————————————————————————————
题目要求最小摄像头数目,如果从头节点开始看,就只能省一个摄像头,而如果从叶子节点开始看,就可以省下指数级的摄像头数目;
所以可以确定遍历顺序是从叶子节点开始向上遍历,让叶子节点的父节点装摄像头即可;
很容易想到是后序遍历,根据贪心思想有:
局部最优:叶子节点的父节点安摄像头,所用摄像头最少;
全局最优:整体二叉树所用摄像头最少;

然后该考虑装摄像头的情况了,这里需要考虑每个节点可能的状态,有三种:
1,有摄像头覆盖
2,没有摄像头覆盖
3,有摄像头

注意:这里“没有摄像头”状态就是1和2了;

所以可以用三个数字表示节点状态:
0:该节点无覆盖
1:该节点有摄像头
2:该节点有覆盖

这里还需要考虑一点:空节点怎么办?(终止条件)
空节点如果是没有覆盖状态,那么叶节点就得有摄像头,所以我们需要将空节点赋为有覆盖的状态;

整个递归函数整体框架有了,接下来是每一层的逻辑情况,有四种:
1,左孩子和右孩子都有覆盖(2),那么父节点就需要是无覆盖状态(0)
2,左孩子和右孩子至少有一个没有覆盖,那么父节点就需要是有摄像头状态(1)
3,左孩子和右孩子至少有一个有摄像头,那么父节点就需要是有覆盖的状态(2)
4,头节点没有覆盖,那么需要单独给它加一个摄像头;

分析完了,代码如下:

/*** 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 ans = 0;//0:无覆盖 1:有摄像头 2:有覆盖int traverse(TreeNode* root) {if (!root) return 2;int left = traverse(root -> left);int right = traverse(root -> right);//情况二if (!left || !right) {ans++;return 1;}//情况三if (left == 1 || right == 1) {return 2;}//情况一if (left == 2 && right == 2) {return 0;}return -1;}int minCameraCover(TreeNode* root) {//情况四if (!traverse(root)) {ans++;}return ans;}
};

968. 监控二叉树(递归+贪心)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 738.单调递增的数字,714. 买卖股票的最佳时机含手续费,968.监控二叉树

    738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的. 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 ...

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

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

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

    Day36 周日休息~ 一.参考资料 单调递增的数字 https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9 ...

最新文章

  1. RESTful_URI资源
  2. 使Win10用户获得特殊权限以便删除相应文件(夹)
  3. igxe查询交易机器人_区块链数字货币交易所开发功能技术解决方案 | 拾里郎
  4. java线程 锁_Java多线程(二) 多线程的锁机制
  5. 01_11_Strtus2简单数据验证
  6. 代码片段:基于 JDK 8 time包的时间工具类 TimeUtil
  7. PDF怎么编辑修改内容
  8. 下行物理信道rs_下行物理信道rs_LTE下行物理信道与物理信号
  9. 钢管代替钢筋土钉杆体在粉砂及松填土层基坑土钉支护中的运用(MATLAB实现)
  10. FPGA经典设计思想
  11. Android 外网连接解决方案
  12. 暨南大学计算机系录取分数线,暨南大学2017年在广东省各专业录取分数线
  13. 值得推荐的在线报表设计器
  14. 计算机房的红蜘蛛软件怎么取消,如何脱离学校机房的红蜘蛛控制软件的控制?...
  15. python中的可迭代是什么意思_Python可迭代跟迭代器的区别
  16. 力扣周赛337场 第一题6319.奇偶位数
  17. autojs实用文档
  18. html window 网络邻居,解决Windows7系统局域网网上邻居看不到其它同事电脑方法
  19. MHT: Basic Methods for Data Association(二)Track Score Function
  20. CUDA: 程序优化的15个策略

热门文章

  1. 安装mysql提示找不到msv_安装mysql服务时提示“找不到msvcp140.dll”
  2. 数据中心停机事故的教训:关注基础设施
  3. 如何定期按时完成数据中心的测试?
  4. json移除一个元素_leetcode:203.移除链表元素,听说用虚拟头节点会方便很多?
  5. 成功解决将python的列表格式输出数值(如pandas.read_excel().describe()),批量转到表格内daiding
  6. 成功解决ValueError: Dimension 1 in both shapes must be equal, for ‘Assign_8‘ (op: ‘Assign‘) with input s
  7. 成功解决matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been repla
  8. ML之FE:数据处理—特征工程之特征选择常用方法之基于搜索策略的三种分类、基于评价准则划分的三种分类(Filter/Wrapper/Embedded)及其代码实现
  9. Py之demjson:Python库之demjson的简介、安装、使用方法详细攻略
  10. About The FTP