• Leetcode 968


    1 题目

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

    2 题意

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

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

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

    图见原题

    例如:

    输入:[0,0,null,0,0]
    输出:1
    

    3 思路

    参考了该题解的思路:https://leetcode-cn.com/problems/binary-tree-cameras/solution/chao-ji-hao-li-jie-de-da-an-by-levyjeng/

    author's blog == http://www.cnblogs.com/toulanboy/

    大体框架:根据左孩子和右孩子的情况,决定父亲是否要装监控。

    具体策略为:从底向上扫描节点,根据孩子的状态进行决定当前节点的状态。

    (1)左右孩子其中有1个没被覆盖,那么父节点装监控。

    (2)左右孩子若都被覆盖,那么父节点是没有被覆盖(先不装监控,结合该节点的父亲的情况处理)

    (3)左右孩子有1个或以上装了监控(另外一个是已覆盖状态),那么当前节点都是已被覆盖。

    用以下数字表示节点的状态

    0 - 该节点没有被覆盖

    1 - 该节点上装有监控

    2 - 该节点已被覆盖

    4 代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    //author's blog == http://www.cnblogs.com/toulanboy/
    class Solution {
    public:
        int ans = 0;
        /*
        大体框架:根据左孩子和右孩子的情况,决定父亲是否要装监控。
        具体策略为:从底向上扫描节点。
        (1)左右孩子其中有1个没被覆盖,那么父节点装监控。
        (2)左右孩子若都被覆盖,那么父节点是没有被覆盖(先不装监控,结合该节点的父亲的情况处理)
        (3)左右孩子有1个或以上装了监控(另外一个是已覆盖状态),那么当前节点都是已被覆盖。
    
        用以下数字表示节点的状态
        0 - 该节点没有被覆盖
        1 - 该节点上装有监控
        2 - 该节点已被覆盖
        */
    
        int get_status(TreeNode * root){
            if(root == NULL)
                return 2;
            int left_status = get_status(root->left);
            int right_status = get_status(root->right);
            //左右孩子其中有1个没被覆盖,那么父节点装监控。
            if(left_status == 0 || right_status == 0){
                ans++;
                return 1;
            }
            //左右孩子若都被覆盖,那么父节点是没有被覆盖(先不装监控,结合该节点的父亲的情况处理)
            if(left_status + right_status == 4){
                return 0;
            }
            //左右孩子有1个或以上装了监控(另外一个是已覆盖状态),那么当前节点都是已被覆盖。
            if(left_status + right_status >= 2){
                return 2;
            }
            return -1;
        }
        int minCameraCover(TreeNode* root) {
            if(get_status(root) == 0)
                ans++;//由于未覆盖的节点都是交由其父亲处理,所以可能存在根未被覆盖的情况
            return ans;
        }
    };
    
  • 相关阅读:
    BZOJ 2016十连测 D3T3序列
    Luogu3579 Solar Panels
    POI2014解题报告
    BZOJ4377 Kurs szybkiego czytania Luogu 3589[POI2015]KUR
    Luogu3587[POI2015]POD
    BZOJ4386[POI2015]Wycieczki / Luogu3597[POI2015]WYC
    BZOJ4381 : [POI2015]Odwiedziny / Luogu3591[POI2015]ODW
    HDU 1133 Buy the ticket
    HDU RPG的错排 【错排&&组合】
    【转】求逆元的n种方法
  • 原文地址:https://www.cnblogs.com/toulanboy/p/13710926.html
Copyright © 2020-2023  润新知