目录
一、题目
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
二、示例
示例 1:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。
示例 2:
输入:[0,0,null,0,null,0,null,null,0]
输出:2
解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。
提示:
- 给定树的节点数的范围是 [1, 1000]
- 每个节点的值都是 0
三、思路
1、数字0,1,2分别表示当前结点装监控、当前结点可观、当前结点不可观
2、二叉树的后序遍历
四、代码
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# 0: 该结点装监控
# 1:该结点可观
# 2:该结点不可观
class Solution:
def minCameraCover(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.nums = 0
def DFS(root):
if root is None:
return 1
l = DFS(root.left)
r = DFS(root.right)
# 该结点左右孩子只要有1个不可观,那么该结点装监控,self.nums + 1,并且return 0
if l == 2 or r == 2:
self.nums += 1
return 0
# 该节点左孩子右孩子只要有1个装监控,那么该结点可观,无需装监控,return 1
if l == 0 or r == 0:
return 1
# 否则,该结点不可观
else:
return 2
if root is None:
return 0
if DFS(root) == 2:
self.nums += 1
return self.nums
if __name__ == '__main__':
root = TreeNode(0)
root.left = TreeNode(0)
root.left.left = TreeNode(0)
root.left.right = TreeNode(0)
s = Solution()
new_root = s.minCameraCover(root)
print(new_root)