题目如下
解题思路
把每个节点分为3个状态来做
0:未被覆盖
1:已被覆盖
2:需放置摄像头
后序遍历
c++代码
/**
* 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 {
public:
int res = 0;
int minCameraCover(TreeNode* root) {
if(dfs(root) == 0){
res++;
}
return res;
}
int dfs(TreeNode* root){
if(root == NULL) return 1;
int left = dfs(root->left);//遍历左节点
int right = dfs(root->right);//遍历右节点
if(left ==0 || right==0){
res++;
return 2;
}//左右孩子均为已覆盖状态,则当前节点未被覆盖,标志为0
if(left == 1 && right == 1){
return 0;
}//若左右孩子为一个覆盖一个放置了摄像头,则当前节点为已被覆盖,标志为1
if(left+right >= 3){
return 1;
}//此时已经组合完了根节点所有情况,随便返回一个整数即可
return 0;
}
};