题意
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
思路分析
根据节点的左右子节点的状态来判断自身的状态
每个节点可能有三种状态
- 不可见
- 可见但没放置监视器
- 放置监视器
后序遍历,当节点的状态为3时监视器数量+1
1.)若左右子节点中有一个为状态1(不可见),则当前节点状态为3(放置监视器)
2.) 若左右子节点有一个为状态3(放置监视器),则当前节点状态为2(可见但没放置监视器)
3.)若左右子节点都为状态2(可见但是没放置监视器),则当前节点状态为1(不可见)
代码
class Solution {
private int ans = 0;
public int minCameraCover(TreeNode root) {
if (root == null) return 2;
if (dfs(root) == 3) ans++;
return ans;
}
private int dfs(TreeNode node) {
if (node == null)
return 2;
int left = dfs(node.left), right = dfs(node.right);
if (left == 1 || right == 1) {
ans++;
return 3;
} else if (left == 3 || right == 3){
return 2;
} else
return 1;
}
}