一、Problem
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。
二、Solution
方法一:后序遍历
因为根节点要获取子节点的状态才能做出判断,所以此题必定是后序遍历,子节点可能的状态有(我们约定为):
- 0:子节点未被监控
- 1:子节点安装了监控
- 2:根节点可被监控
class Solution {
public:
// 0:未被监控;1:此节点安装了监控;2:该结点可被监控
int c;
int dfs(TreeNode* root) {
if (root == NULL) {
return 2;
}
int l = dfs(root->left), r = dfs(root->right);
if (l == 0 || r == 0) { //子节点之一没有安装,那么根就要安装
c++;
return 1;
} else if (l == 1 || r == 1) { //子节点之一安装了监控,那么根结点可被监控
return 2;
} else { //子节点可被监控,但不确保根结点可被监控
return 0;
}
}
int minCameraCover(TreeNode* root) {
return dfs(root) == 0 ? c+1 : c;
}
};
复杂度分析
- 时间复杂度:,
- 空间复杂度:,