力扣刷题日记 968. 监控二叉树(未AC)

968. 监控二叉树

题目描述

在这里插入图片描述

题解思路

数据范围为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;
    }
};

/*
    其实是一个后序遍历,先左后右再根进行遍历
*/

结语

如果有想一起每天互相监督刷题的小伙伴可以加上微信,咱们一起加油呀!也可以一起讨论讨论题目

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值