小黑看完题解思路后代码
# 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个小时申论的挣扎,让小黑知道了什么叫认真的重在参与,从小到大从来没一口气写那么多字
尝试一下坐公交回家,却遭遇多起交通事故的堵车
终于到达北京西站,坐地铁回家
饭后红酒牛排吹起来
新书包到啦
开启早高峰干饭之旅
把按摩仪退了
午餐 刷题 面试 下午怒干双人餐