提示:LeetCode学习打卡
简介
广度优先搜索是用来搜索图或者树的算法,与深度优先搜索不同的是,它是先搜索自己周围所有相邻的节点,不会搜索到最深处才返回值。追求的是广度。
在实现过程中往往需要借助一个队列来完成遍历,算法图解如下:
1.将根节点入队,然后将根节点出队
2.出队后将,根节点的左右孩子入队。
3.然后一直出队,直到队列为空。再加入每个节点的左右孩子,以此类推。
一、LeetCode 例题
1.637.二叉树的层平均值
解题思路:
使用广度优先搜索遍历每一层,将每一层的节点相加之后求平均值。
# 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 averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
"""
#广度优先搜索
"""
ans = [] # 返回结果
queue = collections.deque([root]) #初始化队列
while queue:
total = 0 #计算每一层的合
size = len(queue) # size 表示当前队列中有多少元素,也就是这一层有多少节点
for _ in range(size):
node = queue.popleft()
total+=node.val
left = node.left
right = node.right
if left!=None:
queue.append(left) # 做孩子入队
if right != None:
queue.append(right) #有孩子入队
ans.append(total/size) #计算平均值
return ans
2.剑指offer|| 044.二叉树每层的最大值
这题的解题思路和上一题完全一致。只需要将求和改为求最大值即可:
# 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 largestValues(self, root: TreeNode) -> List[int]:
if root==None:
return []
ans = []
queue = collections.deque([root])
while queue:
max_value = -float('inf')
size = len(queue)
for _ in range(size):
node = queue.popleft()
max_value = max(max_value,node.val)
left = node.left
right = node.right
if left:
queue.append(left)
if right:
queue.append(right)
ans.append(max_value)
return ans
连代码都是一样的形状。
3.迷宫问题探索中。。。。。
总结
后续会在深度优先和广度优先搜索里面添加迷宫问题的解法。