LeetCode 968 监控二叉树 HERODING的LeetCode之路

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

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

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

示例 1:
在这里插入图片描述

输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

示例 2:
在这里插入图片描述

输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。

提示:

给定树的节点数的范围是 [1, 1000]。
每个节点的值都是 0。

解题思路:
有三个状态:
0=>这个结点待覆盖
1=>这个结点已经覆盖
2=>这个结点上安装了相机
代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
private:
    int res = 0;
public:
    int minCameraCover(TreeNode* root) {
    
    
        if(lrd(root) == 0){
    
    
            res ++;
        } 
        return res;
    }

    int lrd(TreeNode * node){
    
    
        if(node == NULL){
    
    
            return 1;
        }
        int left = lrd(node->left);
        int right = lrd(node->right);
        if(left == 0 || right == 0){
    
    
            res ++;
            return 2;
        }
        if(left == 1 && right == 1){
    
    
            return 0;
        }
        if(left + right >= 3){
    
    
            return 1;
        }
        return -1;
    }
};

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/108723698