栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 968. 监控二叉树***

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 968. 监控二叉树***

具体思路:

想到了从下向上保留状态,但是没想到是三状态;

感觉是见过树状态遍历见过最难的题了;

这里一定要注意,每个节点有三个状态:

  1. 根结点覆盖,整棵树所需要的最小监视器个数;
  2. 根结点可以不覆盖,整棵树所需要的最小监视器个数;
  3. 保证左右子树全覆盖,根结点覆盖与否都可以;

此时,后续遍历,某个节点必定会收到l1,l2,l3和r1,r2,r3;

此时进行本届节点的三个状态计算;

  1. 第一种情况根节点覆盖,左右子树的根节点就没必要覆盖了,所以为l3+r3+1;
  2. 第二种情况根节点不覆盖,要么左子树根节点覆盖,要么右子树根节点覆盖,要么是第一种情况,所以三者取最小;
  3. 第三种情况左右子树要求全覆盖,只需要l2+r2即可;
具体代码:
 //a 根结点覆盖下,整棵树所需要的最小监视器
 //b 根结点覆盖不覆盖都行,整棵树所需要的最小监视器树;
 //c 覆盖左右子树,跟节点腹部覆盖都可以;
class Solution {
public:
    int minCameraCover(TreeNode* root) {
        auto vec=dfs(root);
        return vec[1];
    }

    vector dfs(TreeNode* root){
        if(!root){
            return {INT_MAX/2,0,0};
        }
        vector left=dfs(root->left);
        vector right=dfs(root->right);
        int a=1+left[2]+right[2];//跟节点如果覆盖,则左右节点不用覆盖,覆盖他们的子节点即可;
        int b=min(a,min(left[0]+right[1],right[0]+left[1]));
        int c=min(a,left[1]+right[1]);
        return {a,b,c};
    }
};```

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869688.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号