• 【20221204】【每日一题】监控二叉树


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

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

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


    思路:

            1、要尽可能的少安装摄像头,那么摄像头不可能安装在叶子节点上,从叶子节点开始从下往上遍历,用左右中的后序遍历方式;

            2、每个节点有3种状态,无覆盖、有摄像头、有覆盖,分别设为0、1、2;

            3、确定好遍历顺序后,终止条件,如果遇到空节点,则默认为有覆盖;

            4、单层逻辑:对左右孩子的状态进行判断,来确定父节点的状态

            主要分成了4种情况:(1)左右孩子均为有覆盖,父节点为无覆盖情况;

                                              (2)左右孩子只要有一个无覆盖,则需要在父节点加一个摄像头;

                                              (3)左右孩子只有有一个摄像头,则父节点就为有覆盖情况;

                                              (4)最后需要对根结点进行判断,如果无覆盖,则需要再加一个摄像头。

    1. class Solution {
    2. private:
    3. int result;
    4. public:
    5. int traversal(TreeNode* root){
    6. //终止条件
    7. if(root==NULL) return 2;
    8. //遍历顺序:左右中 后序遍历
    9. int left=traversal(root->left);
    10. int right=traversal(root->right);
    11. //中
    12. if(left==2&&right==2) return 0;//左右孩子均为有覆盖,父节点为无覆盖情况
    13. if(left==0||right==0)
    14. {
    15. result++;
    16. return 1;//左右孩子只要有一个无覆盖,则需要在父节点加一个摄像头
    17. }
    18. if(left==1||right==1) return 2;//左右孩子只有有一个摄像头,则父节点就为有覆盖情况
    19. return -1;//不会走到这一步
    20. }
    21. int minCameraCover(TreeNode* root) {
    22. result=0;
    23. //对根结点进行判断,如果无覆盖,则需要再加一个摄像头
    24. if(traversal(root)==0) result++;
    25. return result;
    26. }
    27. };

  • 相关阅读:
    数据库期末考前复习题(单选+多选+判断+解答)
    机器人SLAM与自主导航
    月GMV增长千万,这个新兴家电品牌在快手已实现弯道超车
    CentOS 7 搭建 Keepalived+LVS NAT模式 高可用集群
    Win10 + Ubuntu 双系统完美避坑删除 Ubuntu 教程
    Android Compose 入门,深入底层源码分析
    pytorch view()和reshape() 详解
    JUC-CyclicBarrier基础篇
    四、【React-Router5】样式丢失问题
    JSD-2204-JavaScript-Vue-Day05
  • 原文地址:https://blog.csdn.net/HYAIWYH/article/details/128172021