Loading

【力扣】968. 监控二叉树

 

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

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

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

 

示例 1:

 

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

 

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

提示:

给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-cameras

 思考:

  根据题目:每个节点可以有三个状态: 0 未被监控覆盖到、1 已经被覆盖到、2当前节点就是监控点

 

int result = 0;
    public int minCameraCover(TreeNode root) {
        //随便给一个二叉树
        //根据题目:每个节点可以有三个状态: 0 未被监控覆盖到、1 已经被覆盖到、2当前节点就是监控点
        //如果当前节点是一个叶子节点,因为他是没有子节点的,所以可以认为它的子节点已经被覆盖了,也就是1 
        if(dfs(root) == 0){
            result++;
        }
        return result;
    }

    public int dfs(TreeNode root){
        if(root == null){ // 如果当前是空的,则任务当前节点被监控覆盖了
            return 1;
        }
        int leftValue = dfs(root.left);
        int rightValue = dfs(root.right);
        if(leftValue == 1 && rightValue == 1){
            // 如果两个叶子节点都被监控覆盖了,那么当前节点就没有被监控
            return 0;
        }
        if(leftValue == 0 || rightValue == 0){
            //说明这两个叶子节点有个没有被监控
            result++;
            return 2;
        }
        //否则,说明有个叶子节点为2 ,那么就直接把当前节点设置为被监控到
        return 1;
    }

 

posted @ 2020-09-22 18:29  冯廷鑫  阅读(188)  评论(0编辑  收藏  举报