• 968监控二叉树


    class TreeNode:
    def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None
    a = TreeNode(0)
    b = TreeNode(0)
    c = TreeNode(0)
    d = TreeNode(0)
    a.left = b
    b.left = c
    b.right = d
    # 对于子节点来说,我们可以把他定义为三种状态:
    # 状态0:没有被监控。
    # 状态1:被监控,且放置了相机
    # 状态2:被监控,但是没有放置相机。
    # 对于父节点来说,也是三种状态
    # 子节点其中一个为0,父节点为1
    # 子节点其中一个为1,父节点为2
    # 子节点都为2,父节点要为0
    class Solution:
    def minCameraCover(self, root: TreeNode) -> int:
    # 首先判断根节点不能为0
    if not root:
    return 0
    # 这里需要判断根节点的状态,如果根节点状态为0,需要在他这里放置一个相机
    count,status = self.dfs(root)
    if status == 0:
    count += 1
    return count
    def dfs(self,root):
    # 注意这里是None的时候需要放回2,被监控, 但是没有放置相机。
    if not root:
    return 0,2
    # 接收返回的相机数和状态。
    left_count,left_status = self.dfs(root.left)
    right_count,right_status = self.dfs(root.right)
    count = left_count + right_count
    # 如果子节点都为0,表示都没有被监控,那么父节点需要放置相机。
    if left_status == 0 or right_status == 0:
    return count + 1,1
    # 经历上边的if语句,下边只剩下了。11,12,21,22
    # 因此这时如果两个子节点其中一个为1的话就可以保证父节点为2了。
    elif left_status == 1 or right_status == 1:
    return count,2
    # 最后这里两个子节点都被监控,那么父节点就不被监控了。
    elif left_status == 2 and right_status == 2:
    return count,0
    A = Solution()
    print(A.minCameraCover(a))
  • 相关阅读:
    二柱子四则运算程序
    测绘软件使用感受
    二分图的最大匹配、完美匹配和匈牙利算法(转载)
    serialVersionUID的用处(转载)
    RMQ(模板)
    codeforces 825E
    红黑树
    SQL 范式(转载)
    java 移位运算
    [Hnoi2010]Bounce 弹飞绵羊
  • 原文地址:https://www.cnblogs.com/cong12586/p/13720918.html
Copyright © 2020-2023  润新知