作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/binary-tree-cameras/

题目描述

Given a binary tree, we install cameras on the nodes of the tree.

Each camera at a node can monitor its parent, itself, and its immediate children.

Calculate the minimum number of cameras needed to monitor all nodes of the tree.

Example 1:

Input: [0,0,null,0,0]
Output: 1
Explanation: One camera is enough to monitor all nodes if placed as shown.

Example 2:

Input: [0,0,null,0,null,0,null,null,0]
Output: 2
Explanation: At least two cameras are needed to monitor all nodes of the tree. The above image shows one of the valid configurations of camera placement.

Note:

  1. The number of nodes in the given tree will be in the range [1, 1000].
  2. Every node has value 0.

题目大意

如果放置一个摄像机,能覆盖当前节点、两个孩子节点、父亲节点。求最少的放置相机的个数。

解题方法

首先分析,每种节点能被多少种方案覆盖:

  1. 树中间的节点可以被当前节点、两个孩子节点、父亲节点四种方式覆盖。
  2. 根节点,可以被当前节点、两个孩子节点三种方式覆盖。
  3. 如果是叶子节点,可以被当前节点和父亲节点两种方式覆盖。

综上,我们最好的方案应该是从下向上,先设置叶子节点,然后移除所有覆盖的节点;再重复这个步骤。

具体方法是:

我们定义了一个函数dfs,

  1. 如果这个节点是叶子节点,返回0
  2. 如果这个节点是叶子节点的父节点,并且这个节点应该放相机,返回1
  3. 如果这个节点被子节点覆盖了,并且这个节点没有相机,返回2.

对于每个节点的话,

  1. 如果这个节点有子节点,并且这个子节点是叶子节点(节点0),那么当前节点需要相机0;
  2. 如果这个节点有子节点,并且这个子节点放置了相机(节点1),那么当前节点被覆盖了;

如果节点需要相机,那么对返回结果+1,并且返回1.
如果节点被覆盖了,返回2.
否则返回0.

C++代码如下:

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int minCameraCover(TreeNode* root) {
if (dfs(root) == State::NONE)
++ans_;
return ans_;
}
private:
enum class State {NONE = 0, COVERED = 1, CAMERA = 2};
int ans_ = 0;
State dfs(TreeNode* root) {
if (!root) return State::COVERED;
State l = dfs(root->left);
State r = dfs(root->right);
if (l == State::NONE || r == State::NONE) {
++ans_;
return State::CAMERA;
}
if (l == State::CAMERA || r == State::CAMERA) {
return State::COVERED;
}
return State::NONE;
}
};

参考资料:https://leetcode.com/problems/binary-tree-cameras/discuss/211180/JavaC%2B%2BPython-Greedy-DFS

日期

2019 年 1 月 7 日 —— 新的一周开始啦啦啊

最新文章

  1. 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult
  2. C++中虚析构函数作用
  3. ASP.NET MVC系列 框架搭建(二)之仓储层的优化
  4. Windows 上远程访问 Unix 的 XWindow / XManager / X
  5. MDEV Primer
  6. Java 程序中的多线程
  7. 运用bootstrap框架的时候 引入文件的问题
  8. Oracle 12C 新特性之 sqlplus查看History命令
  9. 查看表结构命令(mysql和oracle)
  10. Echarts 数据视图 生成Excel的方法
  11. PHP 二维数组根据某个字段按指定排序方式排序
  12. Linux 多网卡绑定bond
  13. Dynamic CRM 2015学习笔记(3)oData 查询方法及GUID值比较
  14. Linux中的#和$区别
  15. python --- 05 字典 集合
  16. svn cleanup失败
  17. 《Are your lights on?》读后感
  18. php 获取唯一字符串与文件扩展名函数
  19. Uncaught (in promise) Provided element is not within a Document
  20. dfs.datanode.du.reserved 预留空间不生效的问题

热门文章

  1. JS简单入门
  2. Linux服务器I/O性能分析-1
  3. HMS Core Discovery直播预告 | AI画质增强 ,开启超清视界
  4. C语言之内核中的struct list_head 结构体
  5. 巩固javaweb第八天
  6. MapReduce04 框架原理Shuffle
  7. 数组实现堆栈——Java实现
  8. github单独下载某一个文件夹
  9. 【Services】【Web】【tomcat】配置tomcat支持https传输
  10. 【力扣】剑指 Offer 50. 第一个只出现一次的字符