题目描述
题解思路
数据范围为1-1000
题目的内容还是很好理解的,但是因为自己思路上出了一点问题,所以没能AC掉,还是看了题解后发现自己进了死胡同,但想来想去还是写题解记录下来,这样之后总结起来也方便一些
(解题思路来自题解)
第一步:确定节点3个状态,
0代表未被监视;
1代表被监视;
2代表已安装摄像头;
第二步:后序遍历;先处理2个子节点再处理父节点;
第三步:根据子节点的状态返回父节点的状态;
1.子节点有一个状态为0,则父节点返回 2 父节点需要一个摄像头 res++(根据贪心思想 由上面的节点监控下面的节点比较省摄像头);
2.左右2个子节点状态都是1,则父节点返回0 (因为子节点都没有摄像头,所以父节点需要被他的父节点监控;所以他是未被监控0);
3.子节点有一个状态是2,则父节点返回 1 (因为子节点有一个是有摄像头的所以 父节点是被监控了的)
最后。如果根节点的左右子节点都是1 则他是0 需要一个摄像头res++;
/**
* 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:
//0:待覆盖
//1:已覆盖
//2:已安装相机
int res;
int minCameraCover(TreeNode* root) {
res=0;
//如果root仍为覆盖,给root加相机
if(dfs(root)==0)
res++;
return res;
}
int dfs(TreeNode* r){
if(r==NULL)
return 1;//r=NULL说明这里没有结点,视为已覆盖
int left=dfs(r->left);
int right=dfs(r->right);
//下面的节点没有把left或者right覆盖,该结点需要相机才能覆盖他
if(left==0||right==0){
res++;
return 2;
}
//left和right都已经被覆盖了,但是没有安装相机,所以r是待覆盖的
else if(left==1&&right==1){
return 0;
}
//left和right至少有一个相机,该结点必然已经被覆盖
else if(left+right>=3){
return 1;
}
return -1;
}
};
/*
其实是一个后序遍历,先左后右再根进行遍历
*/
结语
如果有想一起每天互相监督刷题的小伙伴可以加上微信,咱们一起加油呀!也可以一起讨论讨论题目