给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。
解题思路:
有三个状态:
0=>这个结点待覆盖
1=>这个结点已经覆盖
2=>这个结点上安装了相机
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
int res = 0;
public:
int minCameraCover(TreeNode* root) {
if(lrd(root) == 0){
res ++;
}
return res;
}
int lrd(TreeNode * node){
if(node == NULL){
return 1;
}
int left = lrd(node->left);
int right = lrd(node->right);
if(left == 0 || right == 0){
res ++;
return 2;
}
if(left == 1 && right == 1){
return 0;
}
if(left + right >= 3){
return 1;
}
return -1;
}
};