968. 监控二叉树

贪心

class Solution {

    int num = 0;

    public int minCameraCover(TreeNode root) {

        /**
         * 如果根节点未被监视,需要单独放一个摄像头
         */
        if (dfs(root) == 0){
            num++;
        }

        return num;
    }

    /**
     * 每个节点可能有的三种状态:
     * 0:本节点未被监视
     * 1:本节点被监视
     * 2:本节点有摄像头
     */
    public int dfs(TreeNode root){

        /**
         * 空节点默认被监视
         */
        if (root == null){
            return 1;
        }

        /**
         * 后序遍历,因为叶子节点数量最多
         * 局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
         */
        int left = dfs(root.left);
        int right = dfs(root.right);

        /**
         * 如果有孩子没有被监视,那父节点需要摄像头
         */
        if (left == 0 || right == 0){

            num++;
            return 2;
        }

        /**
         * 如果两个孩子都已经被监视了,那父节点再装摄像头就浪费了,设置为没有被监视的状态
         */
        if (left == 1 && right == 1){
            return 0;
        }

        /**
         * 其他情况,设置为被监视状态
         */
        return 1;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(logn)
 */

https://leetcode-cn.com/problems/binary-tree-cameras/

posted @ 2022-02-27 11:08  振袖秋枫问红叶  阅读(50)  评论(0)    收藏  举报