zoukankan      html  css  js  c++  java
  • 968. 监控二叉树 力扣(困难) dfs 官方说DP

    968. 监控二叉树

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

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

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

    示例 1:

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


    代码:
    /**
     * 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 res;
        int dfs(TreeNode* root)
        {
            if(root==NULL) return 2; // 2:被覆盖  1:未被覆盖  0:安装监控
            int left=dfs(root->left);
            int right=dfs(root->right);
            if(left==2 && right==2) return 1;  // 如果左右节点,都被覆盖,root节点可以省去监控,让其父节点放监控,贪心,此时root状态就是 未被覆盖。
            if(left==1 || right==1)  // 如果左右节点,有一个没有被覆盖,root也必须 放监控
            {
                res++;
                return 0;
            }
            if(left==0 || right==0) return 2;  // 如果左右节点,安装监控,则root节点状态是 被覆盖,(可能会说另一个几点没有放监控,没有被覆盖呢,这种情况在前面第二个if中包含了)
            return -1;  // 因为必须返回。
        }
        int minCameraCover(TreeNode* root) {
            res=0;
            if(dfs(root)==1) res++;
            return res;
        }
    };
  • 相关阅读:
    iTestin云测试工具
    android 存储操作 大小显示换算 kb mb KB MB 读取
    android 发送短信 判断号码规则 判断字符数70
    android 震动 各种
    10.13总结
    10.8每日总结
    10.9
    10.15
    10.14
    10.12每日总结
  • 原文地址:https://www.cnblogs.com/stepping/p/15563974.html
Copyright © 2011-2022 走看看