• 【leetcode 968. 监控二叉树】解题报告


    解题思路: 由于叶子节点一定不要安装监视器,这样才能使总监视器数量比较少,因此需要从下往上进行判断当前节点的状态(共:3种状态):

    • 0: 当前节点安装了监视器
    • 1: 当前节点可观,但没有安装监视器
    • 2: 当前节点不可观

    对于空节点,我们认为是可观,但没有安装监视器,因此,叶子节点就为不可观的了,设想一个节点的左右孩子(为空)都可观且没有安装监视器,那该节点必然是不可观即2

    有了以上对空节点和叶子节点的处理,我们再来正式分析非终端节点:

    • 若一个节点的左孩子或右孩子不可观,那么该节点必然不可观,需要安装监视器,因此返回0状态
    • 若一个节点的左孩子或右孩子都可观且至少有一个安装了监视器,那么该节点必然是可观的,返回1状态
    • 若一个节点的左右孩子都可观且没安装监视器,那么该节点必然是不可观的,返回2状态

    记住,我们以上的分析都是基于从整个二叉树的叶子节点往根部,即从下往上进行,而且要做的就是将不可观的节点变得可观才行(因此要根据左右孩子的节点的状态来判断当前节点状态并做出调整)

    这里可能会有疑惑,以上的第一条得出当前节点不可观,然后安装了监视器,而第三条也得出当前节点不可观,但却没有安装监视器,而是直接返回的2状态(当前节点不可观).这是为什么?

    因为,对于第一条,因为左右孩子都不可观,为了让左右孩子都可观,则必须给当前节点安装监视器才行,而第三条中,左右孩子都是可观的(没有安装监视器),当前节点的可以直接返回不可观状态,因为后面可以由他的父节点进行摄像头安装,使其变得可观.

    方法一:递归

        // 0:该节点安装了监视器 1:该节点可观,但没有安装监视器 2:该节点不可观
        int monitor = 0;
        int state(TreeNode* node)
        {
            if (node == nullptr) return 1;
            int left  = state(node->left);
            int right = state(node->right);
            // 该节点为0的情况
            if (left == 2 || right == 2)
            {
                monitor++;  // 由于左或右节点不可观,则需要给当前节点安装监视器,为0状态
                return 0;
            } // 为1的情况
            else if (left == 0 || right == 0)
                return 1;   // 当(left!=2&&right!=2)时,才会进行该判断,也就是左右节点一定是可观的,再判断是否有一个安装了监视器,如有安装,则当前节点就不需要安装监视器也可观了,为1状态
            // 为2的情况
            else    // 其他:党(left!=2&&right!=2)&&(left!=0&&right!=0),即left==1&&right==1时,左右节点都可观,但没有监视器,当前节点不可观,为2状态
                return 2;
        }
        int minCameraCover(TreeNode *root)
        {
            if (root == nullptr) return 0;
            if (state(root) == 2) monitor++;    // 如果根节点为2的状态,需要加一个监视器
            return monitor;
        }

     注意:这里的if,else if,else的顺序是不能变的,先判断左右都是不可观的,再就是都可观,左或右至少有一个为监视器,最后才是都可观都无监视器.

  • 相关阅读:
    021-python基础-python介绍及课程简介
    020-python函数和常用模块-文件操作
    019-python函数和常用模块-内置函数
    018-python基础-三元运算和lambda表达式
    017-python函数和常用模块-函数式编程实现登陆和注册
    016-python函数和常用模块-函数定义和使用
    015-python基础-深浅拷贝
    014-python基础-set集合
    013-python基础-课堂练习
    012-python基础-数据运算
  • 原文地址:https://www.cnblogs.com/brianyi/p/10801186.html
Copyright © 2020-2023  润新知