广度优先搜索----BFS
方法:BFS使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。
BFS总共有两个模板:
1.如果不需要确定当前遍历到了哪一层,BFS模板如下。来自力扣大佬
while queue 不空:
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未访问过:
queue.push(该节点)
2.如果要确定当前遍历到了哪一层,BFS模板如下。
这里增加了level表示当前遍历到二叉树中的哪一层了,也可以理解为在一个图中,现在已经走了多少步了。size表示在当前遍历层有多少个元素,也就是队列中的元素数,我们把这些元素一次性遍历完,即把当前层的所有元素都向外走了一步。
level = 0
while queue 不空:
size = queue.size()
while (size --) {
cur = queue.pop()
for 节点 in cur的所有相邻节点:
if 该节点有效且未被访问过:
queue.push(该节点)
}
level ++;
1.二叉树的右视图(medium)
题目:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值
思路:
1)利用广度优先搜索进行层次遍历,记录下每层的最后一个元素
2)利用递归和先序的思想,根节点–》右节点–》左节点,把每层的最右边孩子节点加入
#方法1
def rightSideView(self, root: TreeNode) -> List[int]:
if not root:
return []
res=[]
depth=[]
layer= collections.deque() #创建一个队列
layer.append(root) #存入根节点
while len(layer):
count=0 #某层的第几个元素
next_layer=[] #下一层
while len(layer):
tmp = layer.popleft() #从队列中取值
if count==0: #取某层第一个元素的值
res.append(tmp.val)
count+=1
if tmp.right:
next_layer.append(tmp.right) #先存入右孩子结点
if tmp.left:
next_layer.append(tmp.left)
layer = collections.deque(next_layer) #开始遍历下一层
return res
#方法2
def rightSideView(self, root: TreeNode) -> List[int]:
res=[]
def dfs(root,depth):
if not root:
return []
if len(res)<depth: #当前层的第一个孩子节点(从右往左算起)
res.append(root.val)
dfs(root.right,depth+1) #先存入右节点
dfs(root.left,depth+1)
dfs(root,1)
return res
2.地图分析(medium)
题目:你现在手里有一份大小为 N x N 的「地图」(网格) grid,上面的每个「区域」(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,请你找出一个海洋区域,这个海洋区域到离它最近的陆地区域的距离是最大的。我们这里说的距离是「曼哈顿距离」( Manhattan Distance):(x0, y0) 和 (x1, y1) 这两个区域之间的距离是 |x0 - x1| + |y0 - y1| 。如果我们的地图上只有陆地或者海洋,请返回 -1。
思路:
3.机器人的运动范围(medium)
题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
思路:
4.矩阵(medium)
题目:给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。
思路: