★★[leetCode 968] 监控二叉树

这道题的有几个难点:

  1. 确定什么情况下摄像头的数目是最少的? 答案是叶子节点不放摄像头,否则,如果叶子节点放了摄像头,就相当于浪费了一层的覆盖范围,那么我们遍历二叉树就要从底向上遍历,选择后序遍历
  2. 确定每颗节点的状态。节点的状态可以分为3种,没有被覆盖、有摄像头、被覆盖,有且只有这3种,并且这个节点的状态应该是由它的子节点的状态决定的,如果子节点存在没有被覆盖的情况,那么这个节点就应该有摄像头。
  3. 确定叶子节点的状态,叶子节点都应该是无覆盖状态,那么怎么让它初始化为无覆盖状态呢?答案是,当遇到空节点的时候,返回被覆盖状态,那么叶子节点的左右子节点都会返回被覆盖状态, 叶子节点就是无覆盖状态了。

这道题好理解,但是凭空想真的很不好想。

代码如下

class Solution {
    int res=0;
    public int minCameraCover(TreeNode root) {
        int t=traversal(root);
        if(t==0) res++;
        return res;
    }
    //0无覆盖,1有摄像头,2有覆盖
    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){
            res++;
            return 1;
        }
        if (left==1||right==1) return 2;
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值