给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
思路:
1、要尽可能的少安装摄像头,那么摄像头不可能安装在叶子节点上,从叶子节点开始从下往上遍历,用左右中的后序遍历方式;
2、每个节点有3种状态,无覆盖、有摄像头、有覆盖,分别设为0、1、2;
3、确定好遍历顺序后,终止条件,如果遇到空节点,则默认为有覆盖;
4、单层逻辑:对左右孩子的状态进行判断,来确定父节点的状态
主要分成了4种情况:(1)左右孩子均为有覆盖,父节点为无覆盖情况;
(2)左右孩子只要有一个无覆盖,则需要在父节点加一个摄像头;
(3)左右孩子只有有一个摄像头,则父节点就为有覆盖情况;
(4)最后需要对根结点进行判断,如果无覆盖,则需要再加一个摄像头。
class Solution {
private:
int result;
public:
int traversal(TreeNode* root){
//终止条件
if(root==NULL) return 2;
//遍历顺序:左右中 后序遍历
int left=traversal(root->left);
int right=traversal(root->right);
//中
if(left==2&&right==2) return 0;//左右孩子均为有覆盖,父节点为无覆盖情况
if(left==0||right==0)
{
result++;
return 1;//左右孩子只要有一个无覆盖,则需要在父节点加一个摄像头
}
if(left==1||right==1) return 2;//左右孩子只有有一个摄像头,则父节点就为有覆盖情况
return -1;//不会走到这一步
}
int minCameraCover(TreeNode* root) {
result=0;
//对根结点进行判断,如果无覆盖,则需要再加一个摄像头
if(traversal(root)==0) result++;
return result;
}
};