美文网首页
LeetCode 968. 监控二叉树

LeetCode 968. 监控二叉树

作者: 草莓桃子酪酪 | 来源:发表于2022-08-03 05:15 被阅读0次
题目

给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。

例:
输入:[0,0,null,0,0]
输出:1
解释:如图所示,一台摄像头足以监控所有节点。

方法

因为计算最小摄像头数量,那么应该尽可能少的使用摄像头,所以叶子节点不能放摄像头,叶子节点的父节点放摄像头,并且每隔两层放置摄像头。为了实现该种放置方式应该从下到上遍历二叉树,即使用后序遍历
二叉树上节点一共存在三种状态:安装摄像头、未被覆盖和被覆盖,我们分别用 1、0 和 2 表示

  • result 表示安装摄像头的个数
  • 调用 traversal 函数,对二叉树进行从下到上的遍历,并判断根节点的状态。若根节点的状态为未被覆盖,那么表示该根节点应该安装摄像头,并且更新安装摄像头的数量

traversal 函数:对二叉树进行遍历

  • 若为空节点,那么其状态为被覆盖,返回 2
    因为叶子节点的状态一定为被覆盖,不能安装摄像头,若空节点的状态为未覆盖,那么叶子节点需安装摄像头,不合理,所以空节点的状态为被覆盖
  • left 表示遍历左孩子,right 表示遍历右孩子
  • 若左右孩子的状态为被覆盖,那么此时该节点的状态应为未被覆盖
  • 若左右孩子中至少有一个孩子的状态为未被覆盖,那么此时该节点的状态为安装摄像头,并且更新安装摄像头的数量
  • 若左右孩子中至少有一个孩子的状态为安装摄像头,另一个孩子(或无)的状态为被覆盖,那么此时该节点的状态为被覆盖
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def minCameraCover(self, root: TreeNode) -> int:
        result = 0

        def traversal(node: TreeNode) -> int:
            nonlocal result

            if not node:
                return 2
            left = traversal(node.left)
            right = traversal(node.right)

            if left == 2 and right == 2:
                return 0
            elif left == 0 or right == 0:
                result += 1
                return 1
            elif left == 1 or right == 1:
                return 2
        
        if traversal(root) == 0:
            result += 1
        return result
参考

代码相关:https://programmercarl.com/0968.%E7%9B%91%E6%8E%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html

相关文章

网友评论

      本文标题:LeetCode 968. 监控二叉树

      本文链接:https://www.haomeiwen.com/subject/smysvrtx.html