这道题的有几个难点:
- 确定什么情况下摄像头的数目是最少的? 答案是叶子节点不放摄像头,否则,如果叶子节点放了摄像头,就相当于浪费了一层的覆盖范围,那么我们遍历二叉树就要从底向上遍历,选择后序遍历
- 确定每颗节点的状态。节点的状态可以分为3种,没有被覆盖、有摄像头、被覆盖,有且只有这3种,并且这个节点的状态应该是由它的子节点的状态决定的,如果子节点存在没有被覆盖的情况,那么这个节点就应该有摄像头。
- 确定叶子节点的状态,叶子节点都应该是无覆盖状态,那么怎么让它初始化为无覆盖状态呢?答案是,当遇到空节点的时候,返回被覆盖状态,那么叶子节点的左右子节点都会返回被覆盖状态, 叶子节点就是无覆盖状态了。
这道题好理解,但是凭空想真的很不好想。
代码如下
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
int t=traversal(root);
if(t==0) res++;
return res;
}
//0无覆盖,1有摄像头,2有覆盖
public int traversal(TreeNode root){
if (root==null) return 2;
int left=traversal(root.left);
int right=traversal(root.right);
if (left==2&&right==2){
return 0;
}
if (left==0||right==0){
res++;
return 1;
}
if (left==1||right==1) return 2;
return -1;
}
}