This is a DP problem based on tree as data structure.
We use 'C' to mark cameras, '-' to mark empty node, 'N' to mark node which is not visited yet. For a tree with below structure, there are several situations.
0 / \ 1 2
We could do a post-order DFS to solve this problem. When we are visiting node 0, there could be 3 state for node 1. First is that there are camera in node 1. Second is node 1 is monitored by one of its child. And the third in that node 1 is not under monitoring.
We could get the minimum of cameras for each state in node 0 easily from the 3 states of its 2 children. So we could use it to solve this problem recursivly.
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def minCameraCover(self, root: TreeNode) -> int:
return min(self._helper(root)[0:2])
def _helper(self, node):
if node is None:
return 1, 0, 0
l, r = self._helper(node.left), self._helper(node.right)
camera = min(l) + min(r) + 1
monitored = min(l[0] + r[0], l[0] + r[1], l[1] + r[0])
not_monitored = l[1] + r[1]
return camera, monitored, not_monitored