【20221204】【每日一题】监控二叉树-创新互联

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

创新互联建站坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的钦州网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

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

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


思路:

  1、要尽可能的少安装摄像头,那么摄像头不可能安装在叶子节点上,从叶子节点开始从下往上遍历,用左右中的后序遍历方式;

  2、每个节点有3种状态,无覆盖、有摄像头、有覆盖,分别设为0、1、2;

  3、确定好遍历顺序后,终止条件,如果遇到空节点,则默认为有覆盖;

  4、单层逻辑:对左右孩子的状态进行判断,来确定父节点的状态

  主要分成了4种情况:(1)左右孩子均为有覆盖,父节点为无覆盖情况;

(2)左右孩子只要有一个无覆盖,则需要在父节点加一个摄像头;

(3)左右孩子只有有一个摄像头,则父节点就为有覆盖情况;

(4)最后需要对根结点进行判断,如果无覆盖,则需要再加一个摄像头。

class Solution {
private:
    int result;
public:
    int traversal(TreeNode* root){
        //终止条件
        if(root==NULL)  return 2;
        //遍历顺序:左右中 后序遍历
        int left=traversal(root->left);
        int right=traversal(root->right);
        //中
        if(left==2&&right==2)   return 0;//左右孩子均为有覆盖,父节点为无覆盖情况
        if(left==0||right==0)
        {
            result++;
            return 1;//左右孩子只要有一个无覆盖,则需要在父节点加一个摄像头
        }   
        if(left==1||right==1)   return 2;//左右孩子只有有一个摄像头,则父节点就为有覆盖情况
        return -1;//不会走到这一步
    }
    int minCameraCover(TreeNode* root) {
        result=0;
        //对根结点进行判断,如果无覆盖,则需要再加一个摄像头
        if(traversal(root)==0)  result++;
        return result;
    }
};

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:【20221204】【每日一题】监控二叉树-创新互联
链接分享:http://ybzwz.com/article/cshihi.html