'''
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也标注是困难级别,我当然没有那个幸运能做出来,理解了别人的思路之后,我写了代码。
下面来总结一下这道题的巧妙之处
- 树结构本身就是难点,根据题目本身的意思,我想大部分人都可以想到这道题的解题思路是从子节点出发,即给子节点的父节点添加一个摄像头,从而使得摄像机的数量最少,但实现全面覆盖。但后面的代码实现过程还是很难的,首先你得知道中序遍历的过程,它的结束条件和递归,以及在中间节点的逻辑处理,着其中但凡有一步没想明白,结果、、、你懂的。
- 每个节点的状态有三种,并且对于不同的情况要分别讨论,对于代码中的situation2 和situation3来说,顺序不能颠倒,宁肯多摆设一个摄像机也不能少摆放【当然结果多一个少一个都是错的😂】
- 少说话,多读书,好好学习,天天向上!