LeetCode 968 监控二叉树(困难)

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。

计算监控树的所有节点所需的最小摄像头数量。

示例1:

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

示例 2:

输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。


 思路 + 代码

    0=>这个结点待覆盖

    1=>这个结点已经覆盖

    2=>这个结点上安装了相机。 

    整个递归采用后序遍历,先确定子节点的状态,然后用子节点的状态来确定父节点的状态,从树的底层向上来确定最小的相机数量。

    该思路很好,主要是怎么证明结果是最小值呢?

    其实在叶节点安装相机,那么相机数量一定不是最少的(有可能是最少的),完全可以在叶节点的父节点安装相机。

    

class Solution {

    public int count = 0;
    public int minCameraCover(TreeNode root) {
        if (core(root) == 0) count++;
        return count;
    }
    public int core(TreeNode node){
        if (node == null) return 1;

        int left = core(node.left);
        int right = core(node.right);

        if (left == 0 || right == 0) {
            // 如果子节点有一个需要覆盖,则该节点必须安装相机
            count++;
            return 2;
        }

        if (left == 1 && right == 1) //如果两个子节点都覆盖了,那么父节点便没必要安装相机 
            return 0;
        
        // left + right >= 3 说明至少有一个子节点安装了相机 那么本节点不需要安装相机
        return 1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值