题干
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。
想法
显然一棵树能否被覆盖是要看它的儿子节点的
我们定义状态:
0表示现在这棵树待覆盖,对应的情况是子节点都已经被覆盖了,即,子节点没有摄像头,但是他们被覆盖了。即子节点的子节点的摄像头覆盖了子节点,但是没法覆盖父节点。
1表示现在已经被覆盖
2表示这个位置有摄像头。
对于除了根节点的节点,
如果子节点里至少有一个需要覆盖,那此节点需要安装摄像头,并且统计数量,更新状态。
如果两个子节点都是被覆盖,那么现在父亲节点更新为待覆盖。
如果子节点里有一个有摄像头,那么此节点被覆盖
Java代码
class Solution {
int res=0;
public int minCameraCover(TreeNode root) {
if( lrd(root)==0){
res++;
}
return res;
}
public int lrd(TreeNode node){
//0待覆盖 1已经覆盖 2安装摄像头
if(node==null){
return 1;
}
int left=lrd(node.left);
int right=lrd(node.right);
//子节点都待覆盖,父亲装摄像头
if(left==0||right==0){
res++;
return 2;
}
//子都被覆盖而无摄像头,父亲待覆盖
if(left==1&&right==1){
return 0;
}
//子有摄像头,父亲被覆盖
if(left+right>=3){
return 1;
}
return -1;
}
}