很多题解说用动态规划
但我觉得可以用后续遍历
但是不会实习 感谢题解
class Solution {
private int ans = 0;
public int minCameraCover(TreeNode root) {
ans = 0;
if(afternoon(root) == 2) ans++;
return ans;
}
public int afternoon(TreeNode root){
if( root == null ) return 1;
int left = afternoon(root.left);
int right = afternoon(root.right);
if(left == 1 && right == 1) return 2;
if(left == 2 || right == 2){
ans ++;
return 0;
}
if(left == 0 || right == 0) return 1;
return -1;
}
}
有注释版本链接:https://leetcode.cn/problems/binary-tree-cameras/solution/by-fire_in_winter-tu3o/
class Solution {
private int count;
public int minCameraCover(TreeNode root) {
count = 0;
//最后我们对根节点进行处理,若是根节点并未被其子节点覆盖到,那就应该在根节点放一个摄像头
if(travel(root)==2)
count++;
return count;
}
//子树的状态有三种,0,1,2。0表示的是有摄像头,1表示的是有覆盖,2表示的是没有覆盖
private int travel(TreeNode root){
// 递归的基线情况
//空节点:设置状态为被摄像头覆盖
if(root==null)
return 1;
//查看左子树和右子树的状态,以用于确定本节点的状态
int left = travel(root.left);
int right = travel(root.right);
//如果左子树和右子树均只是被覆盖,那么本节点就应设置为未被覆盖,情况5
if(left==1&&right==1){
return 2;
}
//至少有一个子树的状态是未被覆盖,那么无论如何都应该在本节点设置摄像头
//这里包含的情况 9、8、7、6、3
if(left==2||right==2){
count++;
return 0;
}
//这里是左子树、右子树均被覆盖的基础上,有一个有摄像头或者全有摄像头
//包含1,、2、4
if(left==0||right==0){
return 1;
}
//所有可能在上面已全部被写到,这里是不可能被执行的
return -1;
}
}