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;
    }
};
posted @ 2020-09-22 11:11  偷懒人  阅读(159)  评论(0编辑  收藏  举报