class Solution {
int count = 0;
public int minCameraCover(TreeNode root) {
if(root.left == null && root.right == null) return 1;
backtracking(root);
if(root.val == 0) count++;
return count;
}
public void backtracking(TreeNode node){
if(node == null) return;
backtracking(node.left);
backtracking(node.right);
int l = -1;
int r = -1;
if(node.left == null && node.right == null) node.val = 0;
if(node.left != null) l = node.left.val;
if(node.right != null) r = node.right.val;
//至少有一个是叶子结点,则当前节点放摄像头
if(l == 0 || r == 0) {
node.val = 1;
count++;
}
//没有叶子结点,至少有一个节点放了摄像头
else if(l == 1 || r == 1) node.val = 2;
//因为l和r不可能为0或者1,只有2和-1的可能,所以当前节点可以设置为0
else if(l == 2 || r == 2) node.val = 0;
}
}
自底向上的贪心算法,从0开始,1为放置摄像头的点,2为被摄像头监控到的点。
2307

被折叠的 条评论
为什么被折叠?



