968. Binary Tree Cameras

https://leetcode.com/problems/binary-tree-cameras/

You are given the root of a binary tree. We install cameras on the tree nodes where each camera at a node can monitor its parent, itself, and its immediate children. Return the minimum number of cameras needed to monitor all nodes of the tree.

Example 1: Input: root = [0,0,null,0,0] Output: 1 Explanation: One camera is enough to monitor all nodes if placed as shown. Example 2: Input: root = [0,0,null,0,null,0,null,null,0] Output: 2 Explanation: At least two cameras are needed to monitor all nodes of the tree. The above image shows one of the valid configurations of camera placement.

Constraints:

The number of nodes in the tree is in the range [1, 1000]. 	
Node.val == 0

  • code
class Solution:
    def minCameraCover(self, root: Optional[TreeNode]) -> int:
        covered = {None}
        self.res = 0
        
        def dfs(node, parent = None):
            if node:
                dfs(node.left, node)
                dfs(node.right, node)
                
                if node.left not in covered \
                or node.right not in covered \
                or (node not in covered and parent is None):
                    self.res += 1
                    covered.update({node, node.left, node.right, parent})
        dfs(root)
        return self.res