1. 题目
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-cameras
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 节点只有3种状态
- 1 表示被监控,但是实际没有camera
- 2 表示被监控,有camera
- 0 表示需要被监控
- 左右节点共计9种情况,分类讨论
class Solution {
int mins = 0;
public:
int minCameraCover(TreeNode* root) {
if(!root) return 0;
int l = dfs(root);
if(l == 0)
mins++;
return mins;
}
int dfs(TreeNode* root)
{ // 1表示被监控,但是实际没有camera
// 2表示被监控,有camera
// 0 表示需要被监控
if(!root)
return 1;//没有节点了相当于监控了
int l = dfs(root->left);
int r = dfs(root->right);
if(l==0 || r==0)//5种情况
{
mins++;//左右子节点有任意一个需要被监控
return 2;//节点安装摄像头
}
else if(l==1 && r==1)//1种情况,左右子节点都被监控了
return 0;//本节点无须安装,但是需要被监控
else//12,21,22
{ // 左右子节点有任一为2(摄像头)
return 1;//节点处于被监控状态
}
}
};
24 ms 20.6 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!