Problem with understanding the code of 968. Binary Tree Cameras

Question:

I am studying algorithms and trying to solve the LeetCode problem 968. 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.

I got stuck on it, and after checking the discussion I better understood the logic, but I am still struggling to understand the code:

def minCameraCover(self, root):
    self.res = 0
    def dfs(root):
        if not root: return 2
        l, r = dfs(root.left), dfs(root.right)
        if l == 0 or r == 0:
            self.res += 1
            return 1
        return 2 if l == 1 or r == 1 else 0
    return (dfs(root) == 0) + self.res

I don’t understand why l, r == 0, 0 in a DFS function while the base case is set as if not root: return 2

What are the mechanics behind this that makes dfs(root.left), def(root.right) return 0?

So far I understood that a node has three states:

  • 0: it’s a leaf
  • 1: it has a camera and the node is parent of a leaf
  • 2: it’s being covered, but does not have a camera on it.
Asked By: sakana

||

Answers:

The base case is set for a None, i.e. the absence of a node. Such a virtual position is never a problem, so we can count it as "covered", but there is no camera there. This is why the base case returns 2.

Now when a leaf node is encountered, then obviously both recursive calls will get None as argument and return 2.

Then the expression 2 if l == 1 or r == 1 else 0 will evaluate to 0, as neither l nor r are 1 (they are 2): theelse clause kicks in.

I hope this clarifies that for leaf nodes the return value will be 0, but also for other nodes this can happen: every time both recursive calls return 2, the caller will itself return 0.

Therefore the better explanation of the three states is:

  • 1: the node has a camera
  • 2: the node has no camera, but it is covered from below
  • 0: the node has no camera yet and is not covered from below. If it has a parent, that parent should get a camera so to cover for this node. It it is the root, it must get a camera itself.
Answered By: trincot