小黑看完题解思路后代码
# 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: Optional[TreeNode]) -> int:
'''
状态转移:
0:无覆盖
1:被覆盖
2:放置摄像头
'''
self.result = 0
# 定义递归函数
def dfs(node):
# 结点为空,当成已覆盖
if not node:
return 1
# 后序遍历,判断孩子结点的顺序
left = dfs(node.left)
right = dfs(node.right)
# 左右结点都被覆盖,则该结点不必覆盖
if left == right == 1:
return 0
# 左右结点全是有相机的情况下,该结点被覆盖
elif left == 2 and right == 2 :
return 1
# 其他情况,需要安装相机
elif left == 0 or right == 0:
self.result += 1
return 2
# 一个有相机 一个被覆盖,则这个被覆盖
return 1
root_status = dfs(root)
# 如果root没有被覆盖,则安装相机
if not root_status:
self.result += 1
return self.result

动态规划题解做法
# 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: Optional[TreeNode]) -> int:
'''
状态转移:
0:无覆盖
1:被覆盖
2:放置摄像头
'''
self.result = 0
# 定义递归函数
def dfs(node):
# 结点为空,当成已覆盖
if not node:
return 1
# 后序遍历,判断孩子结点的顺序
left = dfs(node.left)
right = dfs(node.right)
# 左右结点都被覆盖,则该结点不必覆盖
if left == right == 1:
return 0
# 左右结点有一个未被覆盖,则安装相机
elif left == 0 or right == 0:
self.result += 1
return 2
# 其他情况均为被覆盖
return 1
root_status = dfs(root)
# 如果root没有被覆盖,则安装相机
if not root_status:
self.result += 1
return self.result

小黑生活
周五的晚饭与月光



小汤2第21课学习打卡

剪个头清醒清醒

最近太憋了,去医院看看,还好没啥事

麦当劳小憩

下午开启赶考之旅






下午考完搓个澡 足个疗 拔个罐 汗个蒸放松放松






回家路上再垫吧垫吧






第二天继续赶考,上午最后5分钟冲进考场


两个小时行测后,火速吃饭,来个达美乐



提前火速骑行2km赶往喜茶店,准备校招笔试


最后十分钟,连闯红灯,最后一分钟火速到达考场


连续3个小时申论的挣扎,让小黑知道了什么叫认真的重在参与,从小到大从来没一口气写那么多字

尝试一下坐公交回家,却遭遇多起交通事故的堵车






终于到达北京西站,坐地铁回家


饭后红酒牛排吹起来



新书包到啦


开启早高峰干饭之旅



把按摩仪退了

午餐 刷题 面试 下午怒干双人餐

















![[数据库迁移]-LVM逻辑卷管理](https://img-blog.csdnimg.cn/c23844536fa0482a9dfe24fa6954c814.png#pic_center)



![websocket创建时附加额外信息 [如自定义headers信息(利用nginx)]](https://img-blog.csdnimg.cn/7b24f40dab04435eac4fe9b6dcd8e425.png)


