968.监控二叉树

'''
Description: 968.监控二叉树
Autor: 365JHWZGo
Date: 2021-11-12 09:49:31
LastEditors: 365JHWZGo
LastEditTime: 2021-11-12 15:17:07
'''
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution(object):
    

    def minCameraCover(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
		#设置全局变量
        global result 
        result = 0

        def traversal(cur):
			#申明该变量是全局的result而不是局部新的变量
            global result
            #有覆盖 1
            #无覆盖 0
            #有摄像机 2
            
            # 终止条件
            # 空节点,该节点有覆盖
            if cur == None:
                return 1         
        
            left = traversal(cur.left)
            right = traversal(cur.right) 

            #逻辑处理 
            # situation 1:当左右孩子均有覆盖,此时根结点为无覆盖0
            if left==1 and right==1:
                return 0

            #situation 2:当左右孩子中任意一方为无覆盖,此时根结点得有摄像机2
            elif left==0 or right==0:
                result+=1
                return 2

            #situation 3:当左右孩子中任意一方有摄像机时,此时根结点为有覆盖1
            # 不用考虑当孩子一方有摄像机而另一方无覆盖情况,因为在situation 2中已经排除了这种情况                           
            elif left==2 or right ==2:
                return 1
        if traversal(root)==0:
            result+=1 
        return result

    

这道题看上去就很难,连leetcode也标注是困难级别,我当然没有那个幸运能做出来,理解了别人的思路之后,我写了代码。

下面来总结一下这道题的巧妙之处

  1. 树结构本身就是难点,根据题目本身的意思,我想大部分人都可以想到这道题的解题思路是从子节点出发,即给子节点的父节点添加一个摄像头,从而使得摄像机的数量最少,但实现全面覆盖。但后面的代码实现过程还是很难的,首先你得知道中序遍历的过程,它的结束条件和递归,以及在中间节点的逻辑处理,着其中但凡有一步没想明白,结果、、、你懂的。
  2. 每个节点的状态有三种,并且对于不同的情况要分别讨论,对于代码中的situation2 和situation3来说,顺序不能颠倒,宁肯多摆设一个摄像机也不能少摆放【当然结果多一个少一个都是错的😂】
  3. 少说话,多读书,好好学习,天天向上!
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

365JHWZGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值