思路:将节点分为三种状态,0表示该节点安了监控,1表示该节点能被监控但没安监控,2表示该节点不能被监控。
dfs递归,
若左右节点都不能被监控,num+1,返回表示该左右节点的父节点安了监控,(只能父节点安监控才能保证两子节点被监控)。
若左或右子节点安了监控,返回表示该父节点能被监控,但没有安监控。
否则。返回表示该节点没有被监控。
int num = 0;
public int minCameraCover(TreeNode root) {
if(root==null)return 0;
if(dfs(root)==2)num++;
return num;
}
//节点共有三种状态,0:该节点安了监控,1:该节点能被监控,但没装监控,2:该节点没有被监控
private int dfs(TreeNode root) {
if(root==null)return 1;
int left = dfs(root.left),right=dfs(root.right);
if(left==2||right==2){
num++;
return 0;
}else if(left==0 || right==0){
return 1;
}else {
return 2;
}
}