给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
思路
首先要表示节点的状态flag:没有被覆盖:0,被覆盖:1,装了摄像头:2。
可以用递归的形式,也可以根据贪心,看两个字节点的情况。
class Solution:
def minCameraCover(self, root: TreeNode) -> int:
@lru_cache(None)
def dfs(root, flag): ### flag表示当前节点的状态
if not root:
return 1 if flag == 2 else 0
left, right = root.left, root.right
f0 = 1 + dfs(left, 1) + dfs(right, 1)
if flag == 2: ### 当前节点装监视器,那么他的子节点都被覆盖
return f0
if flag == 0: ### 当前节点没有被覆盖,可以装监视器,也可以让子节点装监视器来被覆盖
return min([dfs(left, 2) + dfs(right, 0), dfs(left, 0) + dfs(right, 2), f0])
if flag == 1: ### 当前节点已经被覆盖,可以装监视器,如果当前不装,那么他的子节点都没有被覆盖
return min(dfs(left, 0) + dfs(right, 0), f0)
return dfs(root, 0)
class Solution:
def minCameraCover(self, root: TreeNode) -> int:
self.res = 0
def dfs(root):
if not root:
return 1
left = dfs(root.left)
right = dfs(root.right)
if left == 1 and right == 1:
return 0
if left == 0 or right == 0:
self.res += 1
return 2
if left + right >= 3:
return 1
m = dfs(root)
if m == 0:
self.res += 1
return self.res