贪心 Leetcode 968 监控二叉树

监控二叉树

Leetcode 968

学习记录自代码随想录

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

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

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

要点:1.想到优先覆盖叶子节点,即让叶子节点的父节点有摄像头;

2.想到每个节点有三种状态0-无覆盖,1-摄像头,2-有覆盖;

3.优先覆盖叶子节点,需要从下到上遍历,用后序遍历左右中;

4.四种情况:a.左右节点都有覆盖,则中间节点为无覆盖;b.左右节点至少一个无覆盖,则中间节点为摄像头1;c.左右节点至少一个摄像头,则中间节点为有覆盖;d.最后判断根节点是否为无覆盖,若是,还要添加一个摄像头到根节点;

5.首先是要想到贪心的思路,然后就是遍历和状态推导,此题较难,很难直接想到。

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int result;
    int traversal(TreeNode* cur){
        //节点状态:0-无覆盖,1-摄像头,2-有覆盖
        // 空节点:为有覆盖2, 因为尽量保证叶子节点的父节点有摄像头,所以空节点只能为有覆盖2
        if(cur == nullptr) return 2;

        // 尽量保证叶子节点被覆盖,即叶子节点父节点要有摄像头,所以遍历为后序遍历
        int left = traversal(cur->left);
        int right = traversal(cur->right);

        // 1.左右节点均为有覆盖2,则中间节点为无覆盖0
        if(left == 2 && right == 2) return 0;
        // 2.左右节点至少一个为无覆盖0,则中间节点为摄像头1
        if(left == 0 || right == 0){
            result++;
            return 1;
        }
        // 3.左右节点至少一个有摄像头,则中间节点为有覆盖2
        if(left == 1 || right == 1) return 2;

        return -1;  // 上述代码未使用else,所以逻辑不会走到这里,仅作形式此处
    }
    int minCameraCover(TreeNode* root) {
        // 局部最优:让叶子节点的父节点安摄像头,所用摄像头最少,整体最优:全部摄像头数量所用最少!
        result = 0;
        // 4.如果最后根节点无覆盖,则需要多一个摄像头
        if(traversal(root) == 0){
            result++;
        }
        return result;
    }
};
相关推荐
ZZZ_O^O23 分钟前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King1 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家1 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain1 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-03 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh5 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy5 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java5 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli5 小时前
滑动窗口->dd爱框框
算法