【LeetCode】968. Binary Tree Cameras

  1. 题目地址 968. Binary Tree Cameras
  2. 解析
    本题是一道二叉树的题目,在给定一颗二叉树上安装监控器,每一个监控器安装在一个节点上,该监控器的监控范围包括该节点,直接父节点及两个直接子节点,求每一个节点都能够被监控到的条件下安装的监控器的最少数量。
    本题关键点在于什么情况下必须在一个节点上安装监控器,分析,有两个节点A和B,B是A的左节点且是叶节点,如果在B上安装监控器,由于其没有子节点,该监控器将浪费掉对下监控的两个资源,所以应该在A上安装监控器,可知,当一个节点的两个直接子节点中的至少一个需要该节点提供监控时,则该节点必须安装监控
    定义一个节点向上提供监控的能力,能力值分别为-1,0,1。其中-1表示该节点需要父节点安装监控器;0表示该节点(包括空节点)已被直接子节点安装的监控器所包含;1表示该节点安装了监控,可以向父节点提供监控。 所有的空节点(叶节点的左右节点为空)向上提供监控能力为0。
    对于一个非空节点T:
    1. 若T的直接子节点中至少一个向上提供监控的能力为-1,则在T上安装监控器, 此时T向上提供监控的能力为1;
    2. 否则,若T的直接子节点中至少一个向上提供监控的能力为1,则T被直接子节点上的监控器监控到,不需要在T上安装监控器,此时T向上提供监控的能力为0;
    3. 否则,若T的两个直接子节点向上提供监控的能力都为0,则T需要父节点提供监控,此时T向上提供监控的能力为-1。

代码(Python3)

class Solution:
    def dfs(self, root):
        if not root:
            return 0
        a, b= self.dfs(root.left), self.dfs(root.right)
        if a == -1 or b == -1:  #a == 0, b == -1 或 a == -1, b == 0 或 a == -1, b == -1或 a == 1, b == -1 或 a == -1, b == 1
            self.cnt += 1
            return 1
        elif a == 1 or b == 1:  #a == 0, b == 1 或 a == 1, b == 0 或 a == 1, b == 1
            return 0
        else:   #a == 0, b == 0 
            return -1
                
    def minCameraCover(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root.left and not root.right:
            return 1
        
        self.cnt = 0
        if self.dfs(root) == -1:
            self.cnt += 1
        
        return self.cnt

你可能感兴趣的:(算法,LeetCode)